我试图将一堆连续的无符号整数作为属性传递给我的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 (...).注意这个函数如何缺少规范化的布尔值?它将完全不变的整数顶点数据传递给您的顶点着色器,正是您想要的.
综上所述:
glVertexAttribPointer (...)是良好的数据提供给浮点顶点属性(即vec<N>,mat4,float),并会为您做数据类型转换.
glVertexAttribIPointer (...)是专门为整数属性(即设计ivec<N>,{u}int).
尝试将片段着色器更改为gl_FragColor = vec4(1,0,0,1);这将确保输出颜色使片段可见。
另外,你应该有gl_Position = vec4(0, 0, 0, 1);(原因是 gl_Position 必须位于齐次坐标中,这意味着前三个分量将除以第四个分量。)
| 归档时间: |
|
| 查看次数: |
4939 次 |
| 最近记录: |