C#+ GL控制混合背景与forms
我正在使用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 cap启用并使用GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
所以我认为这不是问题。
也许问题出在纹理环境上?
GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode,GL_MODULATE);
由于空域限制 , 直接混合OpenGL和WPF可能是不可能的。 但是,使用间接方法可以实现您所描述的效果:
- 创建GLControl,但保持不可见(即不要将其附加到WindowsFormsHost)
- 创建一个framebuffer对象( 文档和示例代码 )
- 将OpenGL场景渲染到帧缓冲对象
- 使用
GL.GetTexImage2D()
来检索渲染的场景 - 在常规WPF PictureBox中显示结果
这样,您可以在最终的PictureBox上使用任何和所有WPF效果,包括透明度。
(挑剔:似乎你使用的是OpenTK.GLControl ,而不是Tao.SimpleGlControl。它们共享一个类似的function,但它们的API和function却完全不同。)