【问题标题】:A opengl texture transparent hack一个opengl纹理透明hack
【发布时间】:2021-04-02 04:48:20
【问题描述】:

我希望为 DxWnd 工具(由 SourceForge 托管的开源程序)制作一个 opengl 通用纹理透明 hack。 hack 应该适用于每个使用 opengl 渲染 RGBA 纹理的程序。 DxWnd cah 挂钩并重定向来自库的所有调用,包括 opengl32.dll。 我已阅读并尝试实施有关使纹理透明的所有建议,包括启用 GL_BLEND、禁用 GL_CULL_FACE 和设置 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)。此外,还有一个强制所有纹理像素的 alpha 位的例程。 我预计,一旦完成,结果应该是一个半透明的场景,但这并没有发生。 例如,以下是 gl hexen II 的 3d 场景: 这是最终的结果,一些纹理不透明,大多数像素颜色丢失: 只是为了证明 DxWnd 能够操纵颜色像素(因此这不应该是问题的原因),这是具有重新着色每个纹理的过滤器的同一场景: 问题的原因可能是什么?我应该如何解决它?请注意,由于 DxWnd 正在挂钩一个通用程序,它可能很容易不得不面对具有相反目的的 opengl 调用!

【问题讨论】:

  • 为了正确渲染透明 3D 模型,以特定顺序渲染多边形很重要。首先渲染远离相机的多边形,然后渲染靠近相机的多边形。

标签: c++ opengl textures transparent alpha


【解决方案1】:

你想要的通常不能仅仅通过连接到其他应用程序来实现。

您可以强制开启混合。但是正确的透明渲染与渲染不透明的场景是完全不同的任务。因为 alpha 混合透明度是基于对背景进行每个三角形的混合操作,所以它只有在您以从后到前的顺序渲染所有内容时才真正起作用。

但就程序而言,它认为它在进行不透明渲染。所以它将按照它认为适合使用的顺序进行渲染。对于更现代的应用程序,这可能是从前到后的,以利用早期深度测试。

这正是使透明度发挥作用所需的相反顺序。并且没有通用的方法来控制渲染的顺序,仅仅通过挂钩几个 OpenGL 函数。

此外,应用程序往往会尽量避免渲染场景中明显不可见的部分。因此,如果应用程序认为某个特定房间不可见,因为该房间的门不可见,则该房间及其内容将不会被渲染。所以即使你可以得到正确的渲染顺序,你也需要让程序改变它所渲染的什么,以便正确地看透东西。

还应注意,进行 Alpha 混合需要正在渲染的片段具有有用的 Alpha 值。但大多数不透明表面的片段计算将具有 1.0 的 alpha 值。因此:没有混合。而且,除非您正在处理固定功能的 OpenGL 渲染,或者您愿意手动修补着色器以添加您自己的 alpha 统一值,否则无法从应用程序外部进行更改。

【讨论】:

  • 是的,我知道不可能得到完美的结果,但我只是希望有可能得到比第二张图片更好的东西。我对 glDisable(GL_DEPTH_TEST) 通常不可见的对象有一些看法,但这只是在 z 顺序上作弊并且不使用透明度。
  • 。关于“进行 alpha 混合要求被渲染的片段具有有用的 alpha 值”,是的,我这样做了,我可以在每个纹理像素的 alpha 通道上强制一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多