将uint属性传递给GLSL

ars*_*bon 3 opengl glsl

我试图将一堆连续的无符号整数作为属性传递给我的GLSL着色器.

到目前为止,我想到了

s_number = glGetAttribLocation(shader, "number");

numberData = new GLuint[dotAmount];
for (GLuint i = 0; i < dotAmount; i++) {
    numberData[i] = i;
}

glGenBuffers(1, &vertBuf);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glBufferData(
        GL_ARRAY_BUFFER,
        sizeof(dotAmount),
        numberData,
        GL_STATIC_DRAW
);
Run Code Online (Sandbox Code Playgroud)

渲染功能是

glUseProgram(shader);

[..]

glEnableVertexAttribArray(s_number);
glBindBuffer(GL_ARRAY_BUFFER, vertBuf);

glVertexAttribPointer(
        s_number,
        1,
        GL_UNSIGNED_INT,
        GL_FALSE,
        0,
        BUFFER_OFFSET(0)
);

glDrawArrays(GL_POINTS, 0, dotAmount);
Run Code Online (Sandbox Code Playgroud)

我尝试使用顶点着色器中的数字,如下所示:

attribute uint number;
Run Code Online (Sandbox Code Playgroud)

(名称'vertBuf'实际上有点误导,因为它不是我想传递的顶点数据)我正在使用OpenGL 3和着色器版本1.3.

我想要实现的是,我希望着色器被执行dotAmount一次.定位在着色器内以数学方式完成.但我得到的只是一个空白屏幕......

我很确定问题不在于着色器.我想绘制点,如果我放入gl_Position = vec4(0.0, 0.0, 0.0, 0.0);顶点着色器,我认为它应该绘制一些东西.

And*_*man 28

您正在使用错误的API调用来指定顶点属性指针.

glVertexAttribPointer (...)用于浮点顶点属性.它会愉快地取整数数据类型的值,但最终这个值将转换为浮点数.这就是为什么它有一个控制浮点归一化的参数.启用规范化后,将使用类型的范围调整传递的整数值,使其适合规范化的浮点范围:(有[-1.0, 1.0]符号)或[0.0, 1.0](无符号); 禁用时,有效地将整数视为强制转换为a GLfloat.

在您的情况下,您既不需要上述行为.在顶点着色器中,您的顶点属性不是一个浮点类型,因此让OpenGL将顶点数组数据转换为浮点数将产生无意义的结果.

你需要做的是使用glVertexAttribIPointer (...).注意这个函数如何缺少规范化的布尔值?它将完全不变的整数顶点数据传递给您的顶点着色器,正是您想要的.


综上所述:

  1. glVertexAttribPointer (...)是良好的数据提供给浮点顶点属性(即vec<N>,mat4,float),并会为您做数据类型转换.

  2. glVertexAttribIPointer (...)是专门为整数属性(即设计ivec<N>,{u}int).

  • 我只是想花一点时间来表达我对你的爱.这个答案解决了我所有的问题. (3认同)

fin*_*lia 2

尝试将片段着色器更改为gl_FragColor = vec4(1,0,0,1);这将确保输出颜色使片段可见。

另外,你应该有gl_Position = vec4(0, 0, 0, 1);(原因是 gl_Position 必须位于齐次坐标中,这意味着前三个分量将除以第四个分量。)