Alpha 覆盖在 android 中在某些情况下提供了透明区域,它不应该



我正在用opengl es 2.0为android开发我自己的游戏引擎,我想拥有一些在某些网站上具有透明或半透明纹理的平面。这是因为我将MSAA与GLES20.glEnable(GLES20.GL_SAMPLE_ALPHA_TO_COVERAGE)一起使用。当我尝试渲染其材质没有镜面反射项的东西(如lambert材质)时,我会向着色器发送一个镜面反射值(0,0,0,0),alpha为0.0(最后一项)。

在碎片着色器中,我有下一个代码:

vec4 specularMaterialTerm = vec4 (0.0, 0.0, 0.0, 0.0); /* El canal especular será NO opaco y negro hasta que se sobreescriban sus datos */
if (!Material.hasSpecularTexture){
    specularMaterialTerm = Material.specular;
}
else {
    specularMaterialTerm = texture2D(Material.specularTexture, outTextCoord);
}
specularReflection = attenuation * pow(NdotHV, (Material.shininess)) * vec4(lightSource.lightColor, 1.0) * specularMaterialTerm;
if (Material.hasSpecularTexture){ // premultiplicado por alpha en bitmapfactory de android
    specularReflection.rgb *= specularMaterialTerm.a;
}
if (diffuseMaterialTerm.a != 0.0){
    totalLightingColor = totalLightingColor + diffuseReflection;
}
if (specularMaterialTerm.a != 0.0) {
    totalLightingColor = totalLightingColor + vec4(vec3(specularReflection),1.0);
}

我不明白为什么即使控制alpha为0.0的时间,并且不将其值与线if(specularMaterialTerm.a!=0.0)相加,多重采样也会使我的非半透明纹理变为半透明或透明。在我上传的示例图像中,地板没有镜面反射项,因此它在着色器中的值为0,0,0(alpha 0),但在漫反射纹理中没有半透明值,太阳光线纹理在其纹理中具有透明度,也没有镜面反射。

我希望你能理解我的意思。这是屏幕截图:

https://i.stack.imgur.com/VhZ5z.jpg

编辑:

我不知道这是否与此有关,但这是我的混合函数:

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

对于要杀死样本的alpha到覆盖,片段着色器(在混合之前)编写的最终输出颜色的alpha值必须小于1.0。假设4倍MSAA杀死所有东西,最终的alpha必须小于0.25。

通过修改片段着色器的末端,将所有具有非1.0 alpha的片段设置为(例如,0.0、1.0、0.0、1.0),以显示哪些区域受到alpha到覆盖率测试的影响,可以检查哪些片段受到alpha到复盖率的影响。只要alpha为1.0,任何颜色都可以工作…

TBH场景的问题看起来更像是缺少几何体(假设您谈论的是地板上缺少的大三角形补丁)。您正在使用哪个设备/GPU?

最新更新