【发布时间】:2021-07-01 05:17:35
【问题描述】:
我正在尝试将一堆连续的无符号整数作为属性传递给我的 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 到 dotAmount-1 的序列,你可以读取 gl_VertexID (opengl.org/sdk/docs/manglsl/xhtml/gl_VertexID.xml)。如果您迁移到 GLSL 1.4+,那么您可以使用实例化渲染和 gl_InstanceID。
-
感谢您的提示,非常有用。