我正在尝试将 uint 传递给我的着色器,但我一定做错了什么,因为在着色器中该值是 3212836864 而不是 4294967295。
我有一个顶点数组,在将每个顶点发送到着色器之前将其存储在其中glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 4 * vertexBufferArrayInserts, vertexBufferArray);
这些是我的glVertexAttribPointer电话:
shaderPosAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(shaderPosAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(shaderPosAttrib);
shaderTexCoordAttrib = glGetAttribLocation(shaderProgram, "texCoord");
glVertexAttribPointer(shaderTexCoordAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texCoords));
glEnableVertexAttribArray(shaderTexCoordAttrib);
shaderColorAttrib = glGetAttribLocation(shaderProgram, "color");
glVertexAttribPointer(shaderColorAttrib, 1, GL_UNSIGNED_INT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));
glEnableVertexAttribArray(shaderColorAttrib);
Run Code Online (Sandbox Code Playgroud)
这是顶点结构
struct Vertex
{
Vector2<GLfloat> position;
Vector2<GLfloat> texCoords;
GLuint color;
Vertex() {
}
Vertex(Vector2<GLfloat> position, Vector2<GLfloat> texCoords, GLuint color) {
this->position = position;
this->texCoords = texCoords;
this->color = color;
}
};
Run Code Online (Sandbox Code Playgroud)
顶点着色器:
#version 150
in vec2 position;
in vec2 texCoord;
in uint color;
out vec2 TexCoord;
out uint Color;
uniform mat4 projMat;
void main()
{
TexCoord = texCoord;
Color = color;
gl_Position = projMat * vec4(position, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 150
in vec2 TexCoord;
in uint Color;
out vec4 outColor;
uniform sampler2D tex;
void main()
{
float colorr = 0;
if(Color == 3212836864)
colorr = 1;
outColor = texture(tex, TexCoord) * vec4(colorr, colorr, colorr, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
显然我在某个地方做错了,但我就是看不到它......非常感谢帮助!
这里的问题是确实glVertexAttribPointer指定了浮点数据,因此您必须在着色器中将它们作为float/访问。vec该函数的参数normalized只是指定结果浮点数将被标准化为 [0,1] 或直接转换。理论上,您可以像您一样使用非标准化的 uint,并仅in float color在着色器中使用 - 但您会失去精度。
如果你想直接将整数值传递给着色器,你必须使用glVertexAttribIPointer,它最初是在EXT_gpu_shader4扩展中引入的,并且从版本 3 开始是 GL 核心的一部分。
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |