-1

平面を生成してテクスチャをマッピングする方法を知っています。今、スプライトのように、アルファブレンドされた 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) 回レンダリングしたときの出力は次のとおりです。

出力はすべてめちゃくちゃで、画像のアルファ チャネルを尊重していないようです。コードが正しくレンダリングされるようにするには、コードにどのような変更を加える必要がありますか?

4

1 に答える 1

1

あなたの質問は非常に漠然としています。あなたが探しているのは、ブレンド関数を次のように変更していると思いますglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

これにより、半透明と完全透明の両方のテクスチャ レンダリングが可能になります。

これは深度バッファリングと一緒には機能しないことに注意してください。

于 2016-03-08T15:31:20.130 に答える