2015-10-07 117 views
1

我有使用PNG图片纹理的草地模型。并且我得到白色背景颜色而不是黑色,我想要。为何如此,我该如何解决这个问题?我使用LWJGL 3PNGDecoder.jarLWJGL png纹理透明(textureColour.a白色而不是黑色)

纹理加载器代码:

public int loadTexture(String fileName) { 
    ByteBuffer buf = null; 
    int tWidth = 0; 
    int tHeight = 0; 

    try { 
     // Open the PNG file as an InputStream 
     InputStream in = new FileInputStream("res/" + fileName + ".png"); 
     // Link the PNG decoder to this stream 
     PNGDecoder decoder = new PNGDecoder(in); 

     // Get the width and height of the texture 
     tWidth = decoder.getWidth(); 
     tHeight = decoder.getHeight(); 

     // Decode the PNG file in a ByteBuffer 
     buf = ByteBuffer.allocateDirect(
       4 * decoder.getWidth() * decoder.getHeight()); 
     decoder.decode(buf, decoder.getWidth() * 4, Format.RGBA); 
     buf.flip(); 

     in.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
    } 

    // Create a new texture object in memory and bind it 
    int textureId = GL11.glGenTextures(); 
    GL13.glActiveTexture(textureId); 
    GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId); 

    // All RGB bytes are aligned to each other and each component is 1 byte 
    GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); 

    // Upload the texture data and generate mip maps (for scaling) 
    GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, tWidth, tHeight, 0, 
      GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf); 
    GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D); 

    // Setup the ST coordinate system 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); 

    // Setup what to do when the texture has to be scaled 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, 
      GL11.GL_NEAREST); 
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, 
      GL11.GL_LINEAR_MIPMAP_LINEAR); 

    return textureId; 
} 
+1

我们可以看一下你的着色器,我们可以有一个下载的图片?请记住,您从网站上下载的ThinMatrix图像实际上并不透明。此外,你是否尝试过检查R G和B值是否是100%白色并使其透明? – Joehot200

回答

1

如果你想透明质感看起来透明,您必须启用第一混合。把下面的代码放在你的OpenGL初始化代码中。

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

你也在内部存储你的纹理在RGB,而不是RGBA格式。

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, tWidth, tHeight, 0, 
    GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf); 

应该成为

GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, tWidth, tHeight, 0, 
    GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buf); 
+0

它不工作..我想在stder上设置shader。如: vec4 textureColour = texture(modelTexture,pass_textureCoords);如果(textureColour.a <0.5){ }丢弃; } 但我真的不知道为什么背景是白色的,而不是黑色。 –

+1

为什么你想要草地有黑色的背景?或者你的意思是透明的,所以你可以通过它看到其他物体? – javac

+0

我在下面的教程(https://www.youtube.com/watch?v=ZyzXBYVvjsg&index=15&list=PLRIWtICgwaX0u7Rf9zkZhLoLuZVfUksDP)。他正在使用lwjgl2,我是lwjgl3。所以我在代码上有一些区别。这是问题,因为他有背景黑色和白色。赖利不知道为什么。我认为这可能是由我自己编写的loadTexture方法造成的。在2:05你可以看到我想要的。 –

相关问题