C#和#x2B;GL控件将背景与窗体混合

C#和#x2B;GL控件将背景与窗体混合,c#,wpf,opengl,opengl-es,C#,Wpf,Opengl,Opengl Es,我正在为OpenGL使用C#和OpenTK库,我想将GLControl与作为背景的picturebox混合 *编辑* 我通过更改方法解决了加载源图像的问题,因此现在我使用位图和bitmapdata结构: Bitmap bitmap = new Bitmap("image.png"); BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),

我正在为OpenGL使用C#和OpenTK库,我想将GLControl与作为背景的picturebox混合

*编辑*

我通过更改方法解决了加载源图像的问题,因此现在我使用位图和bitmapdata结构:

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

这是原始图像:

这就是问题所在:

顶部是使用GLControl的纹理,底部是Windows窗体的图片框,我想做的是GLControl的黑色背景变得透明

我启用混合帽并使用
GL.BlendFunc(BlendingFactorSrc.SrcAlpha,BlendingFactorDest.oneminssrcalpha)
也许问题出在纹理环境上

GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode,GL_MODULATE);
因此,直接混合OpenGL和WPF可能是不可能的。但是,可以使用间接方法实现您描述的效果:

  • 创建GLControl,但使其不可见(即,不要将其附加到WindowsFormsHost)
  • 创建帧缓冲区对象(和)
  • 将OpenGL场景渲染到帧缓冲区对象
  • 使用
    GL.GetTexImage2D()
    检索渲染场景
  • 在常规WPF图片框中显示结果
  • 这样,您可以在最终的PictureBox上使用任何和所有WPF效果,包括透明度


    (吹毛求疵:似乎您使用的是Tao.SimpleGlControl,而不是Tao.SimpleGlControl。它们共享类似的功能,但它们的API和功能完全不同。)

    如果您使用
    PixelFormat.Bgra
    纹理,则不需要翻转像素。您能解释一下(屏幕截图?)您的意思吗“但最大的问题是,当我尝试将GLControl与picturebox混合时,似乎混合了图片中的其他信息。”?是的,我的错,它是OpenTK。谢谢你的帮助,我会尝试这个。我对这个限制一无所知。