opengl glMaterialfv vs glMaterialiv

时间:2011-05-15 09:08:31

标签: opengl colors material

将材质数据传递给opengl(在着色器中使用):


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倍才能将它们转换为浮动。

1 个答案:

答案 0 :(得分:6)

glColor3i和glMaterialiv都采用[0,INT_MAX]范围内的颜色,INT_MAX为2 ^ 31 - 1.这说明你的网格是黑色的,255相当于为浮点数传递0.000000119。

从技术上讲,将它作为浮点数或整数传递并不重要。在您的示例中,您已经将各个组件存储为原始大小的4倍,因此不会丢失。

我甚至不相信通过跳过int - >浮点转换将产生任何性能增益,因为驱动程序仍然可以将事物转换为在CPU方面浮动。我在那里猜测,测试必须证明这一点。