, 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.
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
Kodunuz harika. Her zaman kullanırım. –
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