gpt4 book ai didi

java - OpenGL - 颜色布局位置不起作用

转载 作者:行者123 更新时间:2023-12-02 04:29:06 24 4
gpt4 key购买 nike

所以我有一个 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);

...
}

不过,我不认为错误在这里,因为我没有更改绘图函数工作时的情况(当我对 Sprite 颜色使用统一变量时)

但是,这里什么也没有绘制。我搞砸了什么?

即使我在颜色输出中没有使用 SpriteColor,它仍然不会输出任何内容。

最佳答案

通过在 VAO 仍处于绑定(bind)状态时调用 glDisableVertexAttribArray,您无法在渲染时访问这些属性,因为顶点属性是 VAO 状态的一部分。

我不会详细介绍,因为还有很多其他资源解释 VAO。例如:

What are Vertex Array Objects?

glVertexAttribPointer clarification

所以这是我的话的一个小解释:

将 VAO 视为类中的普通对象。每个VAO都有一个状态(其成员变量的值)。当绑定(bind) VAO 然后调用诸如 glEnableVertexAttribArrayglVertexAttribPointer 之类的函数时,当前绑定(bind)的 VAO 的状态会发生变化(就像该对象的 setter 函数一样)。

稍后,在渲染当前绑定(bind)的 VAO 的状态时,会读取并做出适当的 react 。

就您而言:

您在绑定(bind) VAO 时禁用了顶点属性。这意味着您更改了 VAO 的状态,并且在渲染时 OpenGL 认为您不需要任何属性。

关于java - OpenGL - 颜色布局位置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31733003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com