Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL将uint转换为颜色的浮动_C++_Opengl_Constructor_Byte_Glsl - Fatal编程技术网

C++ GLSL将uint转换为颜色的浮动

C++ GLSL将uint转换为颜色的浮动,c++,opengl,constructor,byte,glsl,C++,Opengl,Constructor,Byte,Glsl,对于我的程序,我希望将数据作为无符号字节传递到顶点着色器,然后将字节转换为顶点着色器中颜色的浮点值(介于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(aC

对于我的程序,我希望将数据作为无符号字节传递到顶点着色器,然后将字节转换为顶点着色器中颜色的浮点值(介于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的一个bug?)

要传入数据的代码:

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);

如果要读取着色器中的整数,请使用而不是
glvertexattributepointer
(注意“I”)


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

我想出来了。我可以将着色器中的值作为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)));

将顶点数据发送到着色器的代码在哪里?代码现在有问题。谢谢你,尼科尔。谢谢你的提示,但就我的研究而言,他们无论如何都应该做同样的事情。此外,我确实打算稍后使用这些值,但在这里我还没有实现它们。