2011-05-15 85 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