OpenGL -如何创建顺序无关的透明度?

eit6fx6z  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(202)

我一直致力于一个游戏引擎的教育目的,我遇到了这个问题,我似乎找不到答案:
Alpha通道仅适用于已在具有Alpha通道的对象之前绘制的对象 (例如:在一个有3个物体的场景中,比如说一只猫,一只狗和一个瓶子(透明的)。猫和狗都在瓶子后面;首先画出狗,其次是瓶子,第三是猫。只有狗会透过瓶子被看到)。
以下是此问题的图片:

我使用C++作为引擎,Win32 API作为编辑器,GLSL作为着色:

// some code here
vec4 alpha = texture2D(diffuse, texCoord0).aaaa;
vec4 negalpha = alpha * vec4(-1,-1,-1,1) + vec4(1,1,1,0);

vec4 textureComponentAlpha = alpha*textureComponent+negalpha*vec4(1,1,1,0);//(texture2D ( diffuse, texCoord0 ) ).aaaa;

gl_FragColor = (textureComponentAlpha + vec4(additiveComponent.xyz, 0)) * vec4(lightingComponent.xyz, 1);

在C++中:

glEnable(GL_ALPHA_TEST);
glDepthFunc(GL_EQUAL);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

我认为这与alpha测试的方式有关,或者类似的东西。
谁能帮我修修这个?

7vhp5slm

7vhp5slm1#

我使用的是类似于@RetoKoradi评论链接的答案,但我得到了双层透明模型,带有纹理(玻璃内外表面),周围有完全实心的机械和东西。
对于这样的场景,我也使用多通道方法和Z排序是由设置正面的顺序完成的。
1.渲染所有实体对象

*渲染所有透明对象

这是我第一个设置的棘手部分

glGetIntegerv(GL_DEPTH_FUNC,&depth_funct);
glDepthFunc(GL_ALWAYS);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_CULL_FACE);

我得到了单独存储的几何图层(内部和外部),因此Z排序是这样完成的:

  • 使用glFrontFace(GL_CW);渲染外层背面
  • 使用glFrontFace(GL_CW);渲染内层背面
  • 使用glFrontFace(GL_CCW);渲染内层正面
  • 使用glFrontFace(GL_CCW);渲染外层正面

最后恢复

glDisable(GL_BLEND);
glDepthFunc(depth_funct);

*再次渲染所有实体对象

它远不完美,但足以为我的目的,它看起来像这样:

oyxsuwqo

oyxsuwqo2#

我不能鼓励你足够看一看摩根麦奎尔的this NVidia paperthe related blog post
这很容易实现,总体效果很好。

xv8emn3q

xv8emn3q3#

我不完全确定这会对你的情况有所帮助,但是你是否启用了混合和alpha?

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

相关问题