OpenGL - 颜色布局位置不起作用
OpenGL - Color Layout Location Not Working
所以我有一个 Vertex 对象数组,如下所示:
Vertex: {[0.0, 0.0], [1.0, 1.0, 1.0, 1.0], [0.0, 0.0]}
Vertex: {[0.0, 512.0], [1.0, 1.0, 1.0, 1.0], [0.0, 1.0]}
Vertex: {[512.0, 0.0], [1.0, 1.0, 1.0, 1.0], [1.0, 0.0]}
Vertex: {[512.0, 512.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0]}
它是这样组织的:
{[X, Y], [R, G, B, A], [U, V]}
我有一个接受这些作为属性的着色器;
Sprite.vs:
#version 330 core
layout (location = 0) in vec2 vertex;
layout (location = 1) in vec4 color;
layout (location = 2) in vec2 texcoords;
out vec4 SpriteColor;
out vec2 TexCoords;
uniform mat4 gProjection;
void main()
{
SpriteColor = color;
TexCoords = texcoords;
gl_Position = gProjection * vec4(vertex, 0.0, 1.0);
}
Sprite.fs:
#version 330 core
in vec4 SpriteColor;
in vec2 TexCoords;
out vec4 color;
uniform sampler2D gSpriteTexture;
void main()
{
color = SpriteColor * texture(gSpriteTexture, TexCoords);
}
这是我附加属性的方式:
FloatBuffer vertexBuf = BufferUtils.createFloatBuffer(vertices.length * Vertex.numFields());
for (Vertex v : vertices) {
vertexBuf.put(v.toFloatArray());
}
vertexBuf.flip();
vao = glGenVertexArrays();
int vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertexBuf, GL_STATIC_DRAW);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 2, GL_FLOAT, false, Vertex.stride(), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, false, Vertex.stride(), 8);
glVertexAttribPointer(2, 2, GL_FLOAT, false, Vertex.stride(), 24);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Vertex.numFields是8,Vertex.stride()是32。
我的绘制函数:
@Override
public void draw(RenderTarget rt, RenderStates states) {
...
texture.bind(COLOR_TEXTURE_UNIT);
shader.enable();
shader.setTextureUnit(COLOR_TEXTURE_UNIT_INDEX);
shader.setProjection(getOrthoMatrix(rt.getView()));
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
...
}
不过,我认为错误不在这里,因为我没有更改绘图功能(当我使用统一变量作为精灵颜色时)
但是,这里没有画任何东西。我搞砸了什么?
即使我什至不在我的颜色输出中使用 SpriteColor,它仍然没有输出。
通过在 VAO 仍处于绑定状态时调用 glDisableVertexAttribArray
,您无法在渲染时访问这些属性,因为顶点属性是 VAO 状态的一部分。
我不会详细介绍,因为有很多其他资源都在解释 VAO。例如:
What are Vertex Array Objects?
glVertexAttribPointer clarification
所以这里用我的话做一个小小的解释:
将 VAO 视为 类 中的普通对象。每个 VAO 都有一个状态(它们的成员变量的值)。当绑定一个 VAO 然后调用像 glEnableVertexAttribArray
或 glVertexAttribPointer
这样的函数时,当前绑定的 VAO 的状态会改变(就像这个对象的 setter 函数)。
稍后在渲染时读取当前绑定的 VAO 的状态并做出适当的反应。
你的情况:
您在绑定 VAO 时禁用了顶点属性。这意味着您更改了 VAO 的状态,并且在渲染 OpenGL 时认为您不想拥有任何属性。
所以我有一个 Vertex 对象数组,如下所示:
Vertex: {[0.0, 0.0], [1.0, 1.0, 1.0, 1.0], [0.0, 0.0]}
Vertex: {[0.0, 512.0], [1.0, 1.0, 1.0, 1.0], [0.0, 1.0]}
Vertex: {[512.0, 0.0], [1.0, 1.0, 1.0, 1.0], [1.0, 0.0]}
Vertex: {[512.0, 512.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0]}
它是这样组织的:
{[X, Y], [R, G, B, A], [U, V]}
我有一个接受这些作为属性的着色器;
Sprite.vs:
#version 330 core
layout (location = 0) in vec2 vertex;
layout (location = 1) in vec4 color;
layout (location = 2) in vec2 texcoords;
out vec4 SpriteColor;
out vec2 TexCoords;
uniform mat4 gProjection;
void main()
{
SpriteColor = color;
TexCoords = texcoords;
gl_Position = gProjection * vec4(vertex, 0.0, 1.0);
}
Sprite.fs:
#version 330 core
in vec4 SpriteColor;
in vec2 TexCoords;
out vec4 color;
uniform sampler2D gSpriteTexture;
void main()
{
color = SpriteColor * texture(gSpriteTexture, TexCoords);
}
这是我附加属性的方式:
FloatBuffer vertexBuf = BufferUtils.createFloatBuffer(vertices.length * Vertex.numFields());
for (Vertex v : vertices) {
vertexBuf.put(v.toFloatArray());
}
vertexBuf.flip();
vao = glGenVertexArrays();
int vbo = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertexBuf, GL_STATIC_DRAW);
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 2, GL_FLOAT, false, Vertex.stride(), 0);
glVertexAttribPointer(1, 4, GL_FLOAT, false, Vertex.stride(), 8);
glVertexAttribPointer(2, 2, GL_FLOAT, false, Vertex.stride(), 24);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Vertex.numFields是8,Vertex.stride()是32。
我的绘制函数:
@Override
public void draw(RenderTarget rt, RenderStates states) {
...
texture.bind(COLOR_TEXTURE_UNIT);
shader.enable();
shader.setTextureUnit(COLOR_TEXTURE_UNIT_INDEX);
shader.setProjection(getOrthoMatrix(rt.getView()));
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
...
}
不过,我认为错误不在这里,因为我没有更改绘图功能(当我使用统一变量作为精灵颜色时)
但是,这里没有画任何东西。我搞砸了什么?
即使我什至不在我的颜色输出中使用 SpriteColor,它仍然没有输出。
通过在 VAO 仍处于绑定状态时调用 glDisableVertexAttribArray
,您无法在渲染时访问这些属性,因为顶点属性是 VAO 状态的一部分。
我不会详细介绍,因为有很多其他资源都在解释 VAO。例如:
What are Vertex Array Objects?
glVertexAttribPointer clarification
所以这里用我的话做一个小小的解释:
将 VAO 视为 类 中的普通对象。每个 VAO 都有一个状态(它们的成员变量的值)。当绑定一个 VAO 然后调用像 glEnableVertexAttribArray
或 glVertexAttribPointer
这样的函数时,当前绑定的 VAO 的状态会改变(就像这个对象的 setter 函数)。
稍后在渲染时读取当前绑定的 VAO 的状态并做出适当的反应。
你的情况:
您在绑定 VAO 时禁用了顶点属性。这意味着您更改了 VAO 的状态,并且在渲染 OpenGL 时认为您不想拥有任何属性。