我正在尝试将一堆连续的无符号整数作为属性传递给我的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);
放在顶点着色器中,我认为它应该绘制一些东西。
答案 0 :(得分:26)
您使用错误的API调用来指定顶点属性指针。
glVertexAttribPointer (...)
用于浮点顶点属性。它会愉快地取整数数据类型的值,但最终这个值将转换为浮点数。这就是为什么它有一个控制浮点归一化的参数。启用规范化后,将使用类型的范围调整传递的整数值,使其适合规范化的浮点范围:[-1.0, 1.0]
(带符号)或[0.0, 1.0]
(无符号);禁用时,有效地将整数视为强制转换为GLfloat
。
在您的情况下,您既不需要上述行为。在顶点着色器中,您的顶点属性不是一个浮点类型,因此让OpenGL将顶点数组数据转换为浮点数将产生无意义的结果。
您需要做的是使用glVertexAttribIPointer (...)
。注意这个函数如何缺少规范化的布尔值?它将完全不变的整数顶点数据传递给您的顶点着色器,正是您想要的。
总结:
glVertexAttribPointer (...)
适用于向浮点顶点属性(即vec<N>
,mat4
,float
)提供数据,并且会进行数据类型转换对你而言。
glVertexAttribIPointer (...)
专为整数属性设计(即ivec<N>
,{u}int
)。
答案 1 :(得分:1)
尝试将片段着色器更改为gl_FragColor = vec4(1,0,0,1);
这将确保输出颜色使片段可见。
另外,你应该有gl_Position = vec4(0, 0, 0, 1);
(原因是gl_Position必须是同质坐标,这意味着前三个分量将被第四个分割。)