2011-05-15 79 views
1

雖然材料數據傳遞到OpenGL的(在着色器中使用):的OpenGL glMaterialfv VS glMaterialiv


float white[4] ={1.0f,1.0f,1.0f,1.0f}; 

glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, white); 
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, white); 
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white); 

int whitei[4] = {255,255,255,255}; 
glMaterialiv(GL_FRONT_AND_BACK, GL_AMBIENT, whitei); 
glMaterialiv(GL_FRONT_AND_BACK, GL_DIFFUSE, whitei); 
glMaterialiv(GL_FRONT_AND_BACK, GL_SPECULAR, whitei); 

第一個工程漂亮,但第二個只給出了一個黑色網格。兩者在完全相同的背景下使用(基本上我寫了第一個,然後第二個替換了第一個)。

有沒有人知道這是爲什麼? glMaterialiv真的會讓我的生活變得更輕鬆(如果我可以讓它工作),因爲我將我的顏色保持爲rgba字節,而我不確定是否想讓它們變大4倍以將它們轉換爲浮動。

回答

6

glColor3i和glMaterialiv都採用範圍[0,INT_MAX]中的顏色,INT_MAX爲2^31 - 1。這說明您的網格爲黑色,255等同於爲浮動傳遞0.000000119。

從技術上講,將它作爲浮點或整數傳遞應該沒什麼關係。在你的例子中,你已經存儲了4倍於其原始尺寸的單個組件,所以在那裏沒有損失。

我甚至不相信通過跳過int - > float轉換會產生任何性能增益,因爲驅動程序可能仍然會將事物轉換爲在CPU一側浮動。我在那裏猜測,測試必須證明這一點。

+0

我明白了。關於你的表現你是對的:這些值最終被用作着色器中的浮點數,所以轉換應該在某個地方完成。雖然不知道[0,INT_MAX]範圍。這解釋了一切。我只是假設,如果我通過整數,他們將被視爲0 - 黑色,255 - 白色等。我會改變爲花車,再次感謝解釋! – cantrem 2011-05-15 09:37:15

+1

@cantrem:如果您使用着色器,而不是使用glMaterial,則可以使用glUniformi,如果您需要它們作爲着色器中的整數值,則glUniformi會傳遞整數而無需事先進行範圍轉換。 – datenwolf 2011-05-15 10:19:35