无法在 SharpGL 中渲染简单的透明精灵
Can't render simple transparent sprites in 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 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 通道。需要对我的代码进行哪些更改才能确保其正确呈现?
你的问题很含糊。我认为您正在寻找的是将混合函数更改为 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
这将启用半透明和完全透明的纹理渲染。
请注意,这不能与深度缓冲一起使用。
我知道如何生成平面和映射纹理。现在,我正尝试在我的表单上显示一个 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 通道。需要对我的代码进行哪些更改才能确保其正确呈现?
你的问题很含糊。我认为您正在寻找的是将混合函数更改为 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
这将启用半透明和完全透明的纹理渲染。
请注意,这不能与深度缓冲一起使用。