gpt4 book ai didi

java - 纹理渲染为黑色四边形

转载 作者:行者123 更新时间:2023-11-30 02:22:25 26 4
gpt4 key购买 nike

我一直在尝试遵循codethis tutorial on OpenGL3+ textures 中指定,但我的结果最终是黑色而不是纹理。

enter image description here

我正在使用stbimage将纹理使用的图像加载到直接的 ByteBuffer 中,并且可以保证缓冲区中的 RGB 数据至少不均匀 - 所以不可能是这样。

我通常不喜欢转储代码,但目前我看不出还有什么可以做的。这是我的 java 代码和着色器:

GL 是一个指向 LWJGL31 中所有 GL## 功能的接口(interface)。

ShaderProgram 将所有着色器特定内容包装到一个漂亮的黑盒中,该黑盒在第一次调用 use(GL) 时从附加着色器生成着色器程序,然后重用该程序。这对于渲染彩色三角形效果很好,所以我排除了其中的任何错误。

Util.checkError(GL, boolean); 确实检查自上次执行以来累积的任何 OpenGL 错误,如果未设置 boolean 值,则抛出运行时异常(而是静默写入日志) ,如果设置的话)。

渲染代码 update(GL, long) 每帧运行一次

private static final ResourceAPI res = API.get(ResourceAPI.class);

Image lwjgl32;

ShaderProgram prog = new ShaderProgram();
int vbo, vao, ebo;
int texture;

@Override
public void init(GL gl) {

try {
prog.attach(res.get("shaders/texDemo.vert", ShaderSource.class));
prog.attach(res.get("shaders/texDemo.frag", ShaderSource.class));
lwjgl32 = res.get("textures/lwjgl32.png", Image.class);
} catch(ResourceException e) {
throw new RuntimeException(e);
}

float[] vertices = {
// positions // colors // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left
};

int[] indices = {
0, 1, 3, // first triangle
1, 2, 3 // second triangle
};

vao = gl.glGenVertexArrays();
vbo = gl.glGenBuffers();
ebo = gl.glGenBuffers();

gl.glBindVertexArray(vao);

gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo);
gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices, GL.GL_STATIC_DRAW);

gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, ebo);
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices, GL.GL_STATIC_DRAW);

gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 0);
gl.glEnableVertexAttribArray(0);

gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 3 * Float.BYTES);
gl.glEnableVertexAttribArray(0);

gl.glVertexAttribPointer(2, 2, GL.GL_FLOAT, false, 8 * Float.BYTES, 6 * Float.BYTES);
gl.glEnableVertexAttribArray(0);

texture = gl.glGenTextures();
gl.glBindTexture(GL.GL_TEXTURE_2D, texture);

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);

gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB8, lwjgl32.getWidth(), lwjgl32.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, lwjgl32.getImageData());
gl.glGenerateMipmap(GL.GL_TEXTURE_2D);

prog.use(gl);
gl.glUniform1i(gl.glGetUniformLocation(prog.getId(gl), "texture"), 0);

Util.checkError(gl, false);
}

@Override
protected void update(GL gl, long deltaFrame) {
gl.glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glBindTexture(GL.GL_TEXTURE_2D, texture);

prog.use(gl);
gl.glBindVertexArray(vao);
gl.glDrawElements(GL.GL_TRIANGLES, 6, GL.GL_UNSIGNED_INT, 0);
}

@Override
public void clean(GL gl) {
gl.glDeleteVertexArrays(vao);
gl.glDeleteBuffers(vbo);
gl.glDeleteBuffers(ebo);

ShaderProgram.clearUse(gl);
prog.dispose(gl);
}

顶点着色器

#version 330 core

layout (location = 0) in vec3 in_position;
layout (location = 1) in vec3 in_color;
layout (location = 2) in vec2 in_texCoord;

out vec3 color;
out vec2 texCoord;

void main() {
gl_Position = vec4(in_position, 1.0);

color = in_color;
texCoord = vec2(in_texCoord.x, in_texCoord.y);
}

片段着色器

#version 330 core

out vec4 frag_colour;

in vec3 color;
in vec2 texCoord;

uniform sampler2D texture;

void main() {
frag_colour = texture(texture, texCoord) * vec4(color, 1.0);
}
<小时/>

1我将 LWJGL3 的 GL## 静态类包装到单个接口(interface)和实现中,这样我就可以拥有一堆有状态方法来执行诸如识别正在呈现的上下文之类的事情等等。我还尽力从界面中删除非核心功能,这样我就不会尝试使用已弃用的东西

最佳答案

您仅启用索引为 0 的顶点属性,但这 3 次。

像这样调整你的代码:

gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 0);
gl.glEnableVertexAttribArray(0);

gl.glVertexAttribPointer(1, 3, GL.GL_FLOAT, false, 8 * Float.BYTES, 3 * Float.BYTES);
gl.glEnableVertexAttribArray(1); // <-------

gl.glVertexAttribPointer(2, 2, GL.GL_FLOAT, false, 8 * Float.BYTES, 6 * Float.BYTES);
gl.glEnableVertexAttribArray(2); // <------

关于java - 纹理渲染为黑色四边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46428966/

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