GLSL 将 uint 转换为浮点颜色



对于我的程序,我想将数据作为无符号字节传递到顶点着色器中,然后将字节转换为顶点着色器中颜色的浮点值(0.0 到 1.0 之间(,如下所示:

#version 330 core
layout (location = 0) in uvec3 aPos;
layout (location = 1) in uvec4 aColor;
out VS_OUT {
vec4 color;
} vs_out;
void main()
{
vs_out.color = vec4(float(aColor.r) / 255.0f, float(aColor.g) / 255.0f, float(aColor.b) / 255.0f, 1.0f); //alpha set to 1 temporarily
gl_Position = vec4(aPos, 1.0);
}

但是,似乎无论我如何执行构造函数或操作,当输入的字节值为 0(零导致 0.0(以外的任何值时,它总是会转换为 1.0。如何解决此问题,以便获得 0.0 到 1.0 之间的正确颜色值?(或者这是openGL 3.3的错误吗?

用于传入数据的代码:

unsigned char test[] = {
0, 0, 0, 255, 1, 10, 255, 0, 255 //first 3 is position and next 4 is color but still outputs white
};
unsigned int VBO, VAO;
glGenBuffers(1, &VBO);
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(test), &test, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_UNSIGNED_BYTE, GL_FALSE, 9*sizeof(byte), 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_FALSE, 9 * sizeof(byte), (void*)(3 * sizeof(BYTE)));
glBindVertexArray(0);
...
// draw points
ourShader.use();// use pre-defined shaders
glBindVertexArray(VAO);
glDrawArrays(GL_POINTS, 0, 1);

我想通了。我可以将着色器中的 in 值作为 vec4 而不是 uvec4 放置,并将顶点属性设置为规范化,程序将自动转换它:

顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec4 aColor;
out VS_OUT {
vec4 color;
} vs_out;
void main()
{
vs_out.color = aColor;
gl_Position = vec4(aPos, 1.0); 
}

程序代码:

byte test[] = {//unsigned char
0, 0, 0, 25, 100, 136, 255, 0, 255 // ouputs teal color (index 3-6)
};
...
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, (9 * sizeof(byte)), (void*)(3 * sizeof(BYTE)));

如果你想在着色器中读取整数,那么使用glVertexAttribIPointer而不是glVertexAttribPointer(注意'I'(

顺便说一句,您的缓冲区有 9 个值,但目前只使用了 7 个。如果您计划交错更多值(pos、颜色、pos、颜色等(,请查看">步幅"参数;它应该是 7 而不是 9。好吧,我认为您不想浪费2 x numOfVert未使用的字节只是为了保持步幅=9。

最新更新