我正在使用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,0(alpha 0)但在漫反射纹理中没有半透明值,而太阳光线纹理在其中具有透明度纹理,也没有镜面术语。
我希望你能理解我的意思。这是屏幕截图:
http://i.stack.imgur.com/VhZ5z.jpg
编辑:
我不知道这是否有事可做,但这是我的混合功能:
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
答案 0 :(得分:0)
对于要覆盖样本的alpha到coverage,片段着色器(在混合之前)写入的最终输出颜色必须具有小于1.0的alpha值。假设4x MSAA杀死所有东西,最终的alpha必须小于0.25。
您可以通过修改片段着色器的末尾来检查哪些片段受alpha覆盖影响,以将所有片段设置为非1.0 alpha,例如(0.0,1.0,0.0,1.0)来显示区域受到alpha-to-coverage测试的影响。只要alpha为1.0,任何颜色都可以工作......
TBH你的场景问题看起来更像是缺少几何体(假设你在谈论地板上缺少的大三角形补丁)。您使用的是哪种设备/ GPU?