对于我的程序,我希望将数据作为无符号字节传递到顶点着色器中,然后将这些字节转换为浮点值(介于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.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);
2条答案
按热度按时间iqxoj9l91#
我想通了。我只需将着色器中的in值作为ve4而不是uve4,并将vertex属性设置为规格化,程序就会自动转换它:
顶点明暗器:
程序代码:
wqlqzqxt2#
如果要读取着色器中的整数,请使用glVertexAttribIPointer而不是
glVertexAttribPointer
(请注意‘i’)顺便说一句,您的缓冲区有9个值,但当前只使用了7个。如果您计划交织更多的值(位置、颜色、位置、颜色等),那么请查看“stride”参数;它应该是7而不是9。好吧,我认为您不想浪费
2 x numOfVert
未使用的字节数来保持跨度=9。