opengl glMaterialfv 与 glMaterialiv

标签 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 倍只是为了将它们转换为 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/

相关文章:

python - 如何使用pygame和openGL修改相机的 View

java - 按钮背景不变

c# - 如何检查 RGB 颜色以及如何知道此范围是绿色还是红色?

c++ - OpenGL大项目,VAO-s等

c++ - 仅使用顶点着色器进行高效渲染

c++ - OpenGL:着色/插值不工作

WPF 标签前景色

Javascript 自动转换十六进制值

javascript - 小部件中的 WordPress 核心颜色选择器(iris) - 在 WordPress 定制器中编辑时刷新

opencv - OpenGL 中从图像到用户定义的一组点(点云)的纹理映射