有没有办法在VRAM上存储颜色值而不是每个颜色分量浮点数?
由于颜色可以表示为每个组件的字节数,如何强制我的片段着色器从[0-255]而不是默认范围[0.0-1.0]
范围颜色分量如果我使用type GL_UNSIGNED_BYTE
,我是否必须将 bool规范化设置为GL_TRUE
以将它们转换为0.0-1.0值,这些值可由Fragment着色器解释?
答案 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范围内。