我正在使用 java、LWJGL 和 Slick2D 创建一个光线投射器。问题是我似乎无法弄清楚如何正确地从这个字节数组中绘制。
这就是我将纹理放入颜色缓冲区的方式。这行得通。所有的 RGB 值与纹理中的值相同。
public java.awt.Color[] colorBuffer;
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
c = new java.awt.Color(image.getRGB(x, y));
colorBuffer[y * Width + x] = c;}}
现在这是我创建屏幕缓冲区并为其分配像素的方法:
static byte[] buffer;
static int screenTexture;
public static void main() {
buffer = new byte[Display.Height * Display.Width];
screenTexture = GL11.glGenTextures();
texture = new Sprite(new Vector2f(0, 0), "src/Content/Textures/tex1.bmp");
}
// in the raycasting algorithm:
buffer[y * Display.Width + x] = (byte) texture.colorBuffer[texY * texture.Width + texX].getRed();
buffer[y * Display.Width + x + 1] = (byte) texture.colorBuffer[texY * texture.Width + texX].getGreen();
buffer[y * Display.Width + x + 2] = (byte) texture.colorBuffer[texY * texture.Width + texX].getBlue();
buffer[y * Display.Width + x + 3] = (byte) texture.colorBuffer[texY * texture.Width + texX].getAlpha();
这是我绘制缓冲区的方式:
org.newdawn.slick.Color.white.bind();
ByteBuffer b = BufferUtils.createByteBuffer(buffer.length * 4); // times four due to every pixel having RGBA.
for (int a = 0; a < buffer.length; a++) {
b.put(a, buffer[a]);
}
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 2);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, Display.Width / 4, Display.Height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, b);
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(1, 0);
GL11.glVertex2f(Display.Width, 0);
GL11.glTexCoord2f(1, 1);
GL11.glVertex2f(Display.Width, Display.Height);
GL11.glTexCoord2f(0, 1);
GL11.glVertex2f(0, Display.Height);
}
GL11.glEnd();
现在,假设我创建了一个由 3 条垂直线组成的纹理:红色、绿色和蓝色。它将使红色变成白色,其他变成黑色,并且在距离越远的纹理中添加一些颜色。
这是它的样子。绘制文件是原始纹理,右侧窗口是光线投射器。
有谁知道如何解决这个问题?