【问题标题】:Can't render simple transparent sprites in SharpGL无法在 SharpGL 中渲染简单的透明精灵
【发布时间】:2016-06-22 06:29:03
【问题描述】:

我知道如何生成平面和映射纹理。现在,我正在尝试在我的表单上显示一个 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 通道。需要对我的代码进行哪些更改以确保其正确呈现?

【问题讨论】:

    标签: c# opengl sprite texture2d sharpgl


    【解决方案1】:

    你的问题很模糊。我认为您正在寻找的是将混合功能更改为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

    请注意,这不能与深度缓冲一起使用。

    【讨论】:

    • 我真的很抱歉我含糊其辞,我是 OGL 世界的新手,我的术语不太流利。无论如何,我正在将 2D 游戏从 GDI+ 移植到 OpenGL。当我说精灵时,我的意思只是屏幕上的图片。我知道这是通过使用纹理和 UV 贴图绘制四边形来实现的。这可行,但看起来……很奇怪。 alpha 是正确的,但颜色已经变得很糟糕,也许某些通道被忽略了,或者我知道。明天我回到办公室后上传一张照片。
    • OpenGL 要求格式为 RGBA。确保以 32 位颜色指定 PNG 数据,并且 png 解码器不返回任何其他格式的数据,例如 ARGB(我知道 java 的 ImageIO 会这样做)。当您有时间发布这些图片时,我会很高兴地看到它们。
    • 而且,如果我没记错的话,ogl 希望纹理数据以小端序指定。
    • 我现在添加了一张图片。我会提到我已经尝试过 GL_RGBA 和 GL_BGRA 并且我什至处理了图像以移动字节以使 ARGB -> RGBA 无济于事。我确实发现将图像上的“i+1”和“i+2”2 个通道归零后输出保持不变。我可以加你的Skype吗?
    • 根据图片,问题肯定在于错误的字节顺序(字节序或颜色格式)。确保您用于 OGL 的字节顺序以 little endian 格式指定。大端的 RGBA 必须作为 ABGR 发送到小端等。如果这不起作用,你可以在 Skype 上添加我,与此处同名。请注意,我只熟悉一般的 ogl,而不是特别熟悉 GDI+。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多