C++ opengl纹理透明黑客

C++ opengl纹理透明黑客,c++,opengl,textures,transparent,alpha,C++,Opengl,Textures,Transparent,Alpha,我希望为DxWnd工具(一个托管在SourceForge上的开源程序)制作一个opengl通用纹理透明hack。这种技术应该适用于使用opengl渲染RGBA纹理的每个程序。DxWnd cah钩住并重定向来自库的所有调用,包括opengl32.dll。 我已经阅读并尝试实现所有关于使纹理透明的建议,包括启用GL_混合、禁用GL_CULL_面和设置glBlendFunc(GL_SRC_ALPHA、GL_ONE_减去_SRC_ALPHA)。此外,还有一个例程强制执行所有纹理像素的alpha位。 我希

我希望为DxWnd工具(一个托管在SourceForge上的开源程序)制作一个opengl通用纹理透明hack。这种技术应该适用于使用opengl渲染RGBA纹理的每个程序。DxWnd cah钩住并重定向来自库的所有调用,包括opengl32.dll。 我已经阅读并尝试实现所有关于使纹理透明的建议,包括启用GL_混合、禁用GL_CULL_面和设置glBlendFunc(GL_SRC_ALPHA、GL_ONE_减去_SRC_ALPHA)。此外,还有一个例程强制执行所有纹理像素的alpha位。 我希望,一旦完成,结果应该是半透明的场景,但这并没有发生。 例如,以下是gl hexen II的3d场景: 这是最终结果,一些纹理不透明,大多数像素颜色丢失: 为了演示DxWnd能够操纵颜色像素(因此这不应该是问题的原因),这是同一个场景,带有一个重新渲染每个纹理的过滤器:
问题的原因可能是什么?我该怎么修?请注意,由于DxWnd挂接的是一个通用程序,它可能很容易遇到具有相反用途的opengl调用

仅仅通过挂接到其他应用程序通常不可能实现您想要的功能

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

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

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

此外,应用程序倾向于避免渲染场景中明显不可见的部分。因此,如果应用程序认为某个房间不可见,因为该房间的门不可见,那么该房间及其内容将不会被渲染。因此,即使您可以获得正确的渲染顺序,您也需要让程序更改渲染内容,以便正确地看穿内容


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

要正确渲染透明3d模型,必须按特定顺序渲染多边形。首先渲染远离摄影机的多边形,然后渲染靠近摄影机的多边形。是的,我知道不可能得到完美的结果,但我只是希望有可能得到比第二张更好的效果。我得到了一些关于使用glDisable(GL_DEPTH_TEST)通常不可见的对象的视图,但这只是在z顺序上作弊,不使用透明度。关于“进行alpha混合需要渲染的片段具有有用的alpha值”,是的,我这样做了,我可以在每个纹理像素的alpha通道上强制一个值。