C#+ GL控制混合背景与形式

时间:2014-03-13 10:48:39

标签: c# wpf opengl opengl-es

我正在使用OpenGL的C#和OpenTK库,我希望将GLControl与作为背景的图片框混合。

*编辑*

我通过改变方法解决了加载源图像的问题,所以现在我使用位图和位图数据结构:

Bitmap bitmap = new Bitmap("image.png");
BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
         ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

我确信我的png源有4个通道,黑色背景上的alpha值为0

这是原始图片: http://imageshack.com/a/img801/517/u2z8.png

这就是问题所在: http://imageshack.com/a/img40/1729/zezj.jpg

top是使用GLControl的纹理,bottom是Windows Form的Picturebox,我想要做的是GLControl的黑色背景变得透明。

我将Blend上限启用并使用GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);,所以我认为这不是问题。

问题可能出在纹理环境上?

GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode,GL_MODULATE);

1 个答案:

答案 0 :(得分:5)

由于airspace restrictions,直接混合OpenGL和WPF 可能是不可能的。但是,可以使用间接方法实现您所描述的效果:

  1. 创建GLControl,但保持不可见(即不要将其附加到WindowsFormsHost)
  2. 创建一个帧缓冲对象(documentationexample code
  3. 将OpenGL场景渲染为帧缓冲对象
  4. 使用GL.GetTexImage2D()检索渲染的场景
  5. 在常规WPF PictureBox中显示结果
  6. 这样,您可以在最终的PictureBox上使用任何和所有WPF效果,包括透明度。

    (挑剔:看起来你使用的是OpenTK.GLControl,而不是Tao.SimpleGlControl。它们共享一个类似的功能,但它们的API和功能完全不同。)