将uint属性传递给GLSL

时间:2013-09-20 14:59:38

标签: 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
);

渲染功能是

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

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

attribute uint number;

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

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

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

2 个答案:

答案 0 :(得分:26)

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

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

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

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


总结:

  1. glVertexAttribPointer (...)适用于向浮点顶点属性(即vec<N>mat4float)提供数据,并且会进行数据类型转换对你而言。

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

答案 1 :(得分:1)

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

另外,你应该有gl_Position = vec4(0, 0, 0, 1);(原因是gl_Position必须是同质坐标,这意味着前三个分量将被第四个分割。)