gpt4 book ai didi

java - LWJGL 纹理和字符串

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:04 24 4
gpt4 key购买 nike

是否可以在不使用 Slick Framework 的情况下加载 PNG 纹理并在 LWJGL 中绘制字符串?

每次我用谷歌搜索 “如何在 lwjgl 中加载 png 图像” 我得到这样的答案 -> “嘿,只需使用 slick 框架中的纹理加载器”
“如何在 lwjgl 中绘制字符串” -> “只需使用 slick 框架中的 TTFFont 类”

但是我不想用这种半路跨框架的设计。因为我认为这不是最好的方法。

LWJGL 是否有专为纹理或字符串制作的库或扩展?

最佳答案

基本上,您使用 BufferedImage,使用 getRGB()要获取每个像素的 RGB,请获取该数据并将其放入 ByteBuffer 中(用于将图像数据输入到 OpenGL 的数据类型),设置一些纹理数据,并创建 GL_TEXTURE_2D

此代码由 Krythic这样做:

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.ByteBuffer;

import javax.imageio.ImageIO;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL12;

import static org.lwjgl.opengl.GL11.*;

public class TextureLoader {
private static final int BYTES_PER_PIXEL = 4;//3 for RGB, 4 for RGBA
public static int loadTexture(BufferedImage image){

int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());

ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * BYTES_PER_PIXEL); //4 for RGBA, 3 for RGB

for(int y = 0; y < image.getHeight(); y++){
for(int x = 0; x < image.getWidth(); x++){
int pixel = pixels[y * image.getWidth() + x];
buffer.put((byte) ((pixel >> 16) & 0xFF)); // Red component
buffer.put((byte) ((pixel >> 8) & 0xFF)); // Green component
buffer.put((byte) (pixel & 0xFF)); // Blue component
buffer.put((byte) ((pixel >> 24) & 0xFF)); // Alpha component. Only for RGBA
}
}

buffer.flip(); //FOR THE LOVE OF GOD DO NOT FORGET THIS

// You now have a ByteBuffer filled with the color data of each pixel.
// Now just create a texture ID and bind it. Then you can load it using
// whatever OpenGL method you want, for example:

int textureID = glGenTextures(); //Generate texture ID
glBindTexture(GL_TEXTURE_2D, textureID); //Bind texture ID

//Setup wrap mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

//Setup texture scaling filtering
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

//Send texel data to OpenGL
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, image.getWidth(), image.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

//Return the texture ID so we can bind it later again
return textureID;
}

public static BufferedImage loadImage(String loc)
{
try {
return ImageIO.read(MainClass.class.getResource(loc));
} catch (IOException e) {
//Error Handling Here
}
return null;
}
}

要使用此代码,请执行以下操作:

BufferedImage image = TextureLoader.loadImage("/res/test.png");//The path is inside the jar file
int textureID = TextureLoader.loadTexture(image);

您可以将纹理 ID 保存为 final 变量(如果纹理永远不变),或者在每次渲染后使用 GL11.glDeleteTextures(textureID); 卸载纹理

要处理文本,只需手动创建一个 BufferedImage,然后使用 createGraphics()得到 graphics2D()图像的实例。然后,使用 drawString() 绘制到 BufferedImage 上,将其加载到 TextureLoader 中,在屏幕上渲染它,并使用该方法卸载纹理以上。

关于java - LWJGL 纹理和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10801016/

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