我刚刚使用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调用后返回零。
答案 0 :(得分:1)
如果您使用
ByteBuffer buffer = ByteBuffer.wrap(data);
该缓冲区不是"direct"。
您必须使用BufferUtils.createByteBuffer
:
ByteBuffer buffer = BufferUtils.createByteBuffer(data.length);
buffer.put(data);
buffer.flip();
说明:
BufferUtils.createByteBuffer
分配具有指定容量的直接按本机排序的字节缓冲区。
put(vboData)
将数据从当前位置(在这种情况下为缓冲区的开始)开始传输到缓冲区。缓冲区位置增加数据大小。因此,新的缓冲区位置在新数据的末尾。
flip()
将缓冲区的限制(长度)设置为当前位置,然后将该位置设置为零。
答案 1 :(得分:0)