LWJGL Textures and Strings

后端 未结 2 1801
伪装坚强ぢ
伪装坚强ぢ 2020-12-09 04:32

Is it possible to load PNG Textures and draw Strings in LWJGL WITHOUT using the Slick Framework?

Everytime I google \"how to load png images in lwj

2条回答
  •  爱一瞬间的悲伤
    2020-12-09 05:35

    LWJGL now includes STB bindings, which is the preferred way of loading images and fonts, without having to use Slick or even AWT.

    To load a PNG :

    import static org.lwjgl.opengl.GL11.GL_REPEAT;
    import static org.lwjgl.opengl.GL11.GL_LINEAR;
    import static org.lwjgl.opengl.GL11.GL_RGBA;
    import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
    import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER;
    import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER;
    import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S;
    import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T;
    import static org.lwjgl.opengl.GL11.GL_UNPACK_ALIGNMENT;
    import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE;
    import static org.lwjgl.opengl.GL11.glBindTexture;
    import static org.lwjgl.opengl.GL11.glGenTextures;
    import static org.lwjgl.opengl.GL11.glPixelStorei;
    import static org.lwjgl.opengl.GL11.glTexImage2D;
    import static org.lwjgl.opengl.GL11.glTexParameteri;
    import static org.lwjgl.opengl.GL30.glGenerateMipmap;
    import static org.lwjgl.stb.STBImage.stbi_load_from_memory;
    import static org.lwjgl.system.MemoryStack.stackPush;
    import static org.lwjgl.demo.util.IOUtils.ioResourceToByteBuffer;
    
    import java.nio.ByteBuffer;
    import java.nio.IntBuffer;
    
    import org.lwjgl.system.MemoryStack;
    
    public class Texture{
        private int width;
        private int height;
        private int id;
    
        public Texture(String imagePath) {
            ByteBuffer imageData = ioResourceToByteBuffer(imagePath, 1024);
    
            try (MemoryStack stack = stackPush()) {
                IntBuffer w = stack.mallocInt(1);
                IntBuffer h = stack.mallocInt(1);
                IntBuffer components = stack.mallocInt(1);
    
                // Decode texture image into a byte buffer
                ByteBuffer decodedImage = stbi_load_from_memory(imageData, w, h, components, 4);
    
                this.width = w.get();
                this.height = h.get();
    
                // Create a new OpenGL texture 
                this.id = glGenTextures();
    
                // Bind the texture
                glBindTexture(GL_TEXTURE_2D, this.id);
    
                // Tell OpenGL how to unpack the RGBA bytes. Each component is 1 byte size
                glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    
                // Upload the texture data
                glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this.width, this.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, decodedImage);
    
                // Generate Mip Map
                glGenerateMipmap(GL_TEXTURE_2D);
            }
        }
    }
    

    More complete examples for image loading, and text printing can be found in LWJGL source code :

    org.lwjgl.demo.stb

提交回复
热议问题