我一直致力于一个游戏引擎的教育目的,我遇到了这个问题,我似乎找不到答案:
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测试的方式有关,或者类似的东西。
谁能帮我修修这个?
3条答案
按热度按时间7vhp5slm1#
我使用的是类似于@RetoKoradi评论链接的答案,但我得到了双层透明模型,带有纹理(玻璃内外表面),周围有完全实心的机械和东西。
对于这样的场景,我也使用多通道方法和Z排序是由设置正面的顺序完成的。
1.渲染所有实体对象
*渲染所有透明对象
这是我第一个设置的棘手部分
我得到了单独存储的几何图层(内部和外部),因此Z排序是这样完成的:
glFrontFace(GL_CW);
渲染外层背面glFrontFace(GL_CW);
渲染内层背面glFrontFace(GL_CCW);
渲染内层正面glFrontFace(GL_CCW);
渲染外层正面最后恢复
*再次渲染所有实体对象
它远不完美,但足以为我的目的,它看起来像这样:
oyxsuwqo2#
我不能鼓励你足够看一看摩根麦奎尔的this NVidia paper和the related blog post。
这很容易实现,总体效果很好。
xv8emn3q3#
我不完全确定这会对你的情况有所帮助,但是你是否启用了混合和alpha?