C# 为什么我的PNG纹理不具有透明度?

C# 为什么我的PNG纹理不具有透明度?,c#,.net,opengl,glsl,opentk,C#,.net,Opengl,Glsl,Opentk,右下角的图像应该有一个透明的背景 我通过以下函数加载我的切迹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

右下角的图像应该有一个透明的背景

我通过以下函数加载我的切迹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);
}
我的片段着色器如下所示:

#version 330

in vec2 TexCoord0;

uniform sampler2D TexSampler;

void main()
{
    gl_FragColor = texture2D(TexSampler, TexCoord0.xy);
}
我已经用调试器检查了
bmp
,并使用
bmp.GetPixel(255,0)
(就在那棵树苗的上方,在黑色区域),它回来了
(0,0,0,0)
。0是完全透明的,因此。。。我一定是在OpenGL方面做错了什么。但是什么呢


渲染功能 只是需要:

我认为如果你编写自己的着色器,在OpenGL3中没有必要这样做,但我想它仍然是必要的


啊,地雷船,我逃不过你!这看起来像是我在某个地方看过的一个游戏。是的,我想你肯定正确加载了它。这不是问题。我们能看看你的精灵绘图代码吗?…这就是我要找的。XNA中的BlendState.AlphaBlend。混合仍然不受着色器控制。甚至在GL4 core.Like MārtiņšMožeiko已经告诉您混合不受着色器控制。这样做的简单原因是,只有在处理片段之后,即当所有着色器阶段完成执行时,才会发生混合。混合然后发生在GPU的某些硬连线部分。也许,几年后我们会看到一些新的片段着色器输入变量“gl_DestColor”或类似的变量,它允许我们混合到片段着色器中。但时至今日,这将导致的问题(这将对内存访问模式产生巨大影响)仍在抑制着它。@datenwolf:对我来说不是问题;我只需要真正简单的混合。有很多用例,人们真的想要自己混合吗?@马克:确实有。只需看看Photoshop或Gimp中提供的各种图层混合模式。其中大多数只能通过使用着色器或纹理组合器在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();
}
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);