gpt4 book ai didi

java - 在 LWJGL 中使用 glTexImage2D 和 ByteBuffer 时出现空纹理

转载 作者:行者123 更新时间:2023-12-01 16:22:42 27 4
gpt4 key购买 nike

我刚刚使用 float 数组在我的 LWJGL 代码中获得了一个测试纹理。但现在,我需要从文件加载图像并将其存储在纹理中。我已经加载图像并将数据放入 ByteBuffer 对象中,但是当我像这样使用 glTexImage2D 时:

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB,
4, 4, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buffer);

纹理是空的,将渲染为全黑。我看过其他人是如何做到这一点的,但似乎没有任何帮助...函数调用也与 float 数组相同,除了 type 之外当然是参数。是的,我的图像是 RGB,是的,它是 4x4。可能有一些非常简单的事情我没有得到,所以任何帮助都是值得赞赏的。

完整的工作测试程序:

static org.lwjgl.system.MemoryUtil.NULL;

import java.nio.ByteBuffer;

import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;

public class Example {

public static void main(String[] args) {
if (!GLFW.glfwInit()) {
throw new IllegalStateException("Unable to initialize GLFW");
}

// Create a window as the GL context
long window = GLFW.glfwCreateWindow(100, 100, "", NULL, NULL);

if (window == NULL) {
GLFW.glfwTerminate();
throw new RuntimeException("Failed to create the GLFW window");
}

GLFW.glfwMakeContextCurrent(window);

GL.createCapabilities();

// Generate the texture and set parameters
int textureID = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);

// A byte array of 4x4 RBG values
byte[] data = new byte[] {
127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
127, 127, 0, 127, 127, 0, 127, 127, 0, 127, 127, 0,
};
ByteBuffer buffer = ByteBuffer.wrap(data);

// Load the data to the texture
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, 4, 4, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buffer);
// glGetError returns 0.

// Test if the buffer data is correctly stored in the texture.
// I have unrelated problems while getting the data using a
// ByteBuffer, so it's a float array for debug purposes.
float[] floats = new float[data.length];
GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, GL11.GL_FLOAT, floats);
// glGetError returns 0.

for (float f : floats) {
System.out.println(f);
}
// Expected output is 16 times the following:
// 0.5
// 0.5
// 0.0
// Actual output: Random (garbage?) values
// Examples:
// 0.003921569
// 0.87843144
// 1.0
}
}

这为我重现了这个问题。为此需要常用的 LWJGL 库(lwjgl、opengl 和 glfw)。正如代码注释中所述,glGetError 在每次 GL 调用后返回零。

最佳答案

如果您使用

ByteBuffer buffer = ByteBuffer.wrap(data);

缓冲区不是 "direct" .

您必须使用BufferUtils.createByteBuffer :

ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
buffer.put(data);
buffer.flip();

说明:

BufferUtils.createByteBuffer 分配具有指定容量的直接 native 排序字节缓冲区。

put(vboData) 将数据传输到缓冲区,从当前位置开始(在本例中是缓冲区的开头)。缓冲区位置按数据大小递增。所以新的缓冲区位置位于新数据的末尾。

flip() 将缓冲区的限制(长度)设置为当前位置,然后将位置设置为零。

关于java - 在 LWJGL 中使用 glTexImage2D 和 ByteBuffer 时出现空纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62229380/

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