为什么我的PNG纹理没有透明度?

mpe*_*pen 5 .net c# opengl glsl opentk

右下角的图像应该具有透明背景.

我加载 我的 Notch的PNG通过以下功能:

public void Image2D(Bitmap bmp, int mipmapReductionLevel = 0)
{
    var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    var data = bmp.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    GL.TexImage2D(TextureTarget.Texture2D, mipmapReductionLevel, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
        OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);

    bmp.UnlockBits(data);
}

public void Image2D(string filename, int mipmapReductionLevel = 0)
{
    Image2D(new Bitmap(filename), mipmapReductionLevel);
}
Run Code Online (Sandbox Code Playgroud)

我的片段着色器看起来像这样:

#version 330

in vec2 TexCoord0;

uniform sampler2D TexSampler;

void main()
{
    gl_FragColor = texture2D(TexSampler, TexCoord0.xy);
}
Run Code Online (Sandbox Code Playgroud)

bmp用调试器检查过,并使用bmp.GetPixel(255,0)(就在那棵树树苗上面,在黑色区域)然后又回来了(0,0,0,0).文档说 0是完全透明的,所以......我必须在OpenGL方面做错事.但是什么?


渲染功能

protected override void OnRenderFrame(FrameEventArgs e)
{
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    _blockInstanceBuffer.Bind();
    _blockIndexBuffer.Bind();
    GL.DrawElementsInstancedBaseVertex(BeginMode.TriangleStrip, Data.FaceIndices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero, _blockCount, 0);

    SwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)

mpe*_*pen 8

只需要启用混合:

GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
Run Code Online (Sandbox Code Playgroud)

如果您编写自己的着色器,我认为在OpenGL 3中没有必要,但我猜它仍然是.

  • 混合仍然不受着色器控制.即使在GL4核心. (2认同)