存储/传递颜色值(顶点属性)的最有效方法是什么?

时间:2016-01-27 21:05:26

标签: opengl

有没有办法在VRAM上存储颜色值而不是每个颜色分量浮点数?

由于颜色可以表示为每个组件的字节数,如何强制我的片段着色器从[0-255]而不是默认范围[0.0-1.0]

范围颜色分量

如果我使用type GL_UNSIGNED_BYTE,我是否必须将 bool规范化设置为GL_TRUE以将它们转换为0.0-1.0值,这些值可由Fragment着色器解释?

3 个答案:

答案 0 :(得分:1)

首先,VBO只是一堆字节。您需要告诉OpenGL一些有关VBO中数据的信息。一个人通过调用glVertexAttribPointer来做到这一点。

glVertexAttribPointer(index, size, GL_FLOAT, ...)

使用GL_FLOAT OpenGL知道您的数据是float32(4个字节)。在您的情况下,您可以使用GL_BYTE这是一个8位数字,因此您可以编码0到255之间的值。

由于信息仅存储在VAO中,因此可以使用具有不同数据视图的相同VBO。 Here one can find all available types.

答案 1 :(得分:1)

片段着色器的输出独立于顶点着色器的输入。例如,您以RGBA 8位格式存储颜色,它看起来就像这样。

//...
glVertexAttribPointer(  0,4,GL_UNSIGNED_BYTE,FALSE,4,0);
//...

在顶点着色器

//the unsigned bytes are automatically converted to floats in the range [0,255]
//if normalized would have been set to true the range would be [0,1]
layout(location = 0) in vec4 color;
out vec4 c;
//...
c = color; //pass color to fragment shader

片段着色器

in vec4 c;
out vec4 out_color; //output (a texture from a framebuffer)
//....
//the output of the fragment shader must be converted to range [0,1] unless
//you're writing to integer textures (i'm asuming not here)
out_color = c / 255.0f;

答案 2 :(得分:0)

根据glVertexAttribPointer的文档,您必须设置normalize参数,以便将字节缩放到0.0到1.0的范围。

但正如我在你对其他答案的评论中所看到的,你真正的问题在于输出。着色器类型vec4始终包含浮点值,其值必须在0.0到1.0范围内。