将 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 倍只是为了将它们转换为 float 。
最佳答案
glColor3i 和 glMaterialiv 都采用 [0, INT_MAX] 范围内的颜色,INT_MAX 为 2^31 - 1。这解释了您的网格是黑色的,255 相当于为 float 传递 0.000000119。
从技术上讲,将其作为 float 或整数传递应该没有多大关系。在您的示例中,您已经将各个组件存储为其原始大小的 4 倍,因此没有损失。
我什至不相信跳过 int -> float 转换会产生任何性能增益,因为驱动程序仍然可能在 CPU 端将事物转换为浮点型。我推测,测试必须证明这一点。
关于opengl glMaterialfv 与 glMaterialiv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007500/