【问题标题】:C# + GL Control blend background with formC# + GL Control 将背景与表单混合
【发布时间】:2015-12-08 05:01:19
【问题描述】:

我正在使用用于 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 窗体的 Picturebox,我想要做的是 GLControl 的黑色背景变得透明。

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

也许问题出在纹理环境上?

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

【问题讨论】:

  • 如果纹理使用PixelFormat.Bgra,则不需要翻转像素。
  • 您能解释一下(屏幕截图吗?)“但是最大的问题是当我尝试将 GLControl 与图片框混合时,似乎与图片中的其他信息混合完成."?

标签: c# wpf opengl opengl-es


【解决方案1】:

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

  1. 创建 GLControl,但使其不可见(即不要将其附加到 WindowsFormsHost)
  2. 创建帧缓冲区对象(documentationexample code
  3. 将 OpenGL 场景渲染到帧缓冲区对象
  4. 使用GL.GetTexImage2D()检索渲染场景
  5. 在常规 WPF PictureBox 中显示结果

这样,您可以在最终的 PictureBox 上使用任何和所有 WPF 效果,包括透明度。

(吹毛求疵:您使用的似乎是OpenTK.GLControl,而不是Tao.SimpleGlControl。它们具有相似的功能,但它们的API和功能大不相同。)

【讨论】:

  • 是的,我的错,它是 OpenTK。谢谢你的帮助,我会试试这个。我对这些限制一无所知。
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2017-12-15
相关资源
最近更新 更多