C# Can';t在SharpGL中渲染简单的透明精灵

C# Can';t在SharpGL中渲染简单的透明精灵,c#,opengl,sprite,texture2d,sharpgl,C#,Opengl,Sprite,Texture2d,Sharpgl,我知道如何生成平面和贴图纹理。现在,我试图在我的表单上显示一个alpha混合PNG,就像它是一个精灵一样 我通过谷歌搜索和猜测得到了以下代码: // Get the OpenGL object. var gl = openGLControl.OpenGL; // We need to load the texture from file. var textureImage = Resources.Resource1.bg; // A bit of extra initialisatio

我知道如何生成平面和贴图纹理。现在,我试图在我的表单上显示一个alpha混合PNG,就像它是一个精灵一样

我通过谷歌搜索和猜测得到了以下代码:

//  Get the OpenGL object.
var gl = openGLControl.OpenGL;

//  We need to load the texture from file.
var textureImage = Resources.Resource1.bg;

//  A bit of extra initialisation here, we have to enable textures.
gl.Enable(OpenGL.GL_TEXTURE_2D);

//  Get one texture id, and stick it into the textures array.
gl.GenTextures(1, textures);    

//  Bind the texture.
gl.BindTexture(OpenGL.GL_TEXTURE_2D, textures[0]);

gl.Enable(OpenGL.GL_BLEND);
gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_DST_ALPHA);

var locked = textureImage.LockBits(
    new Rectangle(0, 0, textureImage.Width, textureImage.Height),
    System.Drawing.Imaging.ImageLockMode.ReadOnly,
    System.Drawing.Imaging.PixelFormat.Format32bppArgb
);

gl.TexImage2D(
    OpenGL.GL_TEXTURE_2D,
    0,
    4,
    textureImage.Width,
    textureImage.Height,
    0,
    OpenGL.GL_RGBA,
    OpenGL.GL_UNSIGNED_BYTE,
    locked.Scan0
);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S,     OpenGL.GL_CLAMP);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T,     OpenGL.GL_CLAMP);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR);
以下是我正在使用的原始源图像:

以下是我在窗体上渲染此精灵10×10(100)次时的输出:


输出全是乱七八糟的,而且它似乎不尊重图像的alpha通道。需要对我的代码进行哪些更改以确保其正确呈现?

您的问题非常模糊。我认为您需要的是将blend函数更改为
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)

这将启用半透明和完全透明的纹理渲染


请注意,这与深度缓冲不起作用。

我真的很抱歉说得含糊不清,我对OGL的世界还不熟悉,我的术语也不太流利。无论如何,我正在将一个2D游戏从GDI+移植到OpenGL。当我说雪碧的时候,我只是指屏幕上的一张图片。我知道这是通过绘制带有纹理和UV贴图的四边形来实现的。这是可行的,但看起来。。。奇怪。阿尔法是对的,但是颜色已经变了,也许有些频道被忽略了,我知道。我明天回到办公室后会上传一张图片。OpenGL希望格式为RGBA。确保PNG数据以32位颜色指定,并且PNG解码器不会以任何其他格式(如ARGB)返回数据(我知道java的ImageIO会这样做)。当你有时间发布图片时,我会很高兴看到它们。而且,如果我没记错的话,ogl希望纹理数据用little endian指定。我现在已经添加了一幅图像。我要提到的是,我已经尝试了GL_RGBA和GL_BGRA,我甚至处理了图像以移动图灵ARGB->RGBA的字节,但都没有效果。我确实发现,将图像上的“I+1”和“I+2”两个通道归零,输出保持不变。我可以添加你的skype吗?根据图片,问题肯定在于错误的字节顺序(endianess或颜色格式)。确保在little endian中指定了用于OGL的字节顺序。big endian中的RGBA必须作为little endian等的ABGR发送。如果这不起作用,您可以将我添加到skype上,名称与此处相同。请注意,我一般只熟悉ogl,并不特别熟悉GDI+。