2012-05-29 23 views
13

PNG Dokularını yüklemek ve Şerit Çizgisi'ni kullanarak OLMADAN LWJGL Dizeleri çizmek mümkün mü? Ben googleLWJGL Dokular ve Dizeler

Everytime "lwjgl içinde png görüntüleri yüklemek için nasıl" Ben cevaplar bu hale -> "hey sadece kaygan çerçevesinden textureloader kullanmak". için aynı
"lwjgl dizeleri nasıl çizileceğini" ->

"sadece kaygan çerçevesinden TTFFont Class kullanmak" Ama bu yarı yolda-crossframework tasarımını kullanmak istemiyoruz. Çünkü bunun en iyi yol olduğunu düşünmüyorum.

sadece Doku veya Strings için yapılmış LWJGL için herhangi Kütüphaneler veya Uzantıları var mı? Temelde

cevap

22

, sen bazı doku verilerini ayarlamak, bu verileri alıp bir ByteBuffer (OpenGL'ye giriş resim verilerine kullanılan veri türü) koydu, her pikselin RGB almak için getRBG() kullanın ve oluşturmak BufferedImage almak GL_TEXTURE_2D.

Krythic tarafından Bu kod yapar: asla bir final değişken (eğer doku olarak

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

kaydedebilir ya textureID:

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; 
     } 
} 

böyle bir şey yapmak, bu kodu kullanmak için değişiklikleri), ya da her sonrasında doku boşaltmak sadeceoluşturmak, metin yapmak için

GL11.glDeleteTextures(textureID); kullanarak kılmasıdırel ile ve görüntü için graphics2D() örneğini almak için createGraphics() kullanın. Ardından, BufferedImage üzerine çizmek için drawString() kullanın, TextureLoader ürününe yükleyin, ekran üzerinde işlem yapın ve yukarıdaki yöntemi kullanarak dokuyu çıkarın.

+4

Yukarıdaki kod benimdir, ben yazdım bir süre önce. Stack Overflow üzerinde rastgele bulmak için benim sürprizim düşünün! İnternette dolaştığını bilmek beni sıcak ve bulanık hissettiriyor! = P – Krythic

+0

Kodunuz harika. Her zaman kullanırım. –

+1

Ayrıca, Minecraft'ta Renkli Cam oluşturmasına yardımcı olmak için aynı parçacığı Indian'a verdiğim de not edilmelidir. – Krythic

0

lwjgl hemen kaygan hatta AWT kullanmak zorunda kalmadan yükleme görüntü ve yazı tercih edilen yoldur STB bağları içerir.

PNG yüklemek için: görüntü yükleme için

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); 
     } 
    } 
} 

Daha tam örnekler ve metin baskı lwjgl kaynak kodunda bulunabilir:

org.lwjgl.demo.stb

İlgili konular