我在Java中使用OpenGL和Lwjgl。
我只是想用alpha图层渲染我的纹理,但实际上,它看起来像这样: http://puu.sh/8FRzn.png
我的OpenGL配置:
glEnable(GL_TEXTURE_2D);
glBlendFunc (GL_ONE, GL_ONE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GL11.glViewport(0, 0, screenWidth, screenHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screenWidth, screenHeight, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
以及我如何加载我的精灵表:
BLA BLA BLA ..
public static HashMap<String, Integer> loadTexture(String path) {
BufferedImage image = null;
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
try {
image = ImageIO.read(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
int w = image.getWidth();
int h = image.getHeight();
int[] pixels = image.getRGB(0, 0, w, h, null, 0, w);
ByteBuffer buffer = BufferUtils.createByteBuffer(w * h *4);
for(int x = 0; x<w; x++) {
for(int y = 0; y<h; y++) {
Color color = new Color(pixels[x + y * w]);
buffer.put((byte)color.getRed());
buffer.put((byte)color.getGreen());
buffer.put((byte)color.getBlue());
buffer.put((byte)color.getAlpha());
}
}
buffer.flip();
int id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
hashMap.put("width", w);
hashMap.put("height", h);
hashMap.put("id", id);
return hashMap;
}
我用常用方法渲染它:GL_QUADS
是的,我的纹理有一个Alpha图层:http://puu.sh/8FS15.png
我已经在网上搜索了答案,但我的OpenGL“配置”与每次给出的解决方案相同..
答案 0 :(得分:0)
我认为这是BufferedImage未启用Alpha通道的问题。尝试先创建这样的缓冲图像。
默认情况下,当您将图像作为BufferedImage加载时,它不会加载所述图像的Alpha图层。您必须在BufferedImage构造函数中定义此参数。但问题是,通过ImageIO加载图像时,会为您创建BufferedImage,并且您无法设置此选项。通过创建具有第一个图像的宽度和高度的空图像,您可以在新图像中设置此参数。然后,您可以通过使用Graphics2D类修改该图像的像素,这将允许您绘制原始图像(通过ImageIO加载到具有alpha支持的新图像)。它可能看起来有点混乱,但下面的代码示例应该能够稍微改进一下这个解释。
BufferedImage image = new BufferedImage(int width, int height, BufferedImage.TYPE_INT_ARGB);
这将告诉它使用BufferedImage加载alpha通道。
首先需要在单独的BufferedImage中加载图像以获取宽度和高度,然后使用图形类重新绘制它。
以下是一个完整的例子:
try {
BufferedImage in = ImageIO.read(new FileInputStream(path));
BufferedImage image = new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.drawImage(in, 0, 0, null);
g.dispose();
this.image = image;
} catch(IOException e) {
e.printStackTrace();
}
最终的this.image指的是你在课程开始时的主要形象。