Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android中的Alpha-to-coverage在某些情况下提供了不应该的透明区域_Java_Android_Opengl Es_Glsl_Opengl Es 2.0 - Fatal编程技术网

Java android中的Alpha-to-coverage在某些情况下提供了不应该的透明区域

Java android中的Alpha-to-coverage在某些情况下提供了不应该的透明区域,java,android,opengl-es,glsl,opengl-es-2.0,Java,Android,Opengl Es,Glsl,Opengl Es 2.0,我正在用opengl es 2.0为android开发自己的游戏引擎,我想让一些平面的纹理在某些网站上是透明或半透明的。这是因为我将MSAA与GLES20.glEnableGLES20.GL_SAMPLE_ALPHA_TO_覆盖率一起使用。 当我尝试渲染材质没有镜面反射项(如lambert材质)的对象时,我会向着色器发送一个镜面反射值0,0,0,最后一个项的alpha值为0.0 在片段着色器中,我有下一个代码: vec4 specularMaterialTerm = vec4 (0.0, 0.0

我正在用opengl es 2.0为android开发自己的游戏引擎,我想让一些平面的纹理在某些网站上是透明或半透明的。这是因为我将MSAA与GLES20.glEnableGLES20.GL_SAMPLE_ALPHA_TO_覆盖率一起使用。 当我尝试渲染材质没有镜面反射项(如lambert材质)的对象时,我会向着色器发送一个镜面反射值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,但如果specularMaterialTerm.a!=0.0时,多重采样使我的非半透明纹理变为半透明或透明。在我上传到这里的示例图像中,地板没有镜面反射项,因此其在着色器中的值为0,0,0,0 alpha 0,但在漫反射纹理中没有半透明值,阳光纹理在其纹理中具有透明度,并且没有镜面反射项

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

编辑:

我不知道这是否有什么关系,但这是我的混合函数:

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

要使alpha to coverage终止采样,在混合之前由片段着色器写入的最终输出颜色的alpha值必须小于1.0。假设4x MSAA杀死所有东西,最终阿尔法必须小于0.25

通过修改片段着色器的结尾,将所有具有非1.0 alpha的片段设置为(例如)0.0、1.0、0.0、1.0,以显示哪些区域受alpha-to-coverage测试影响,可以检查哪些片段受到alpha-to-coverage的影响。只要alpha为1.0,任何颜色都可以使用


假设你说的是地板上缺少的大三角形补丁,那么你场景中的问题看起来更像是缺少几何体。您正在使用哪个设备/GPU?

场景中没有丢失的几何体。如果禁用“alpha到覆盖”,则地板绘制时不具有透明度。我解决了,但我不明白为什么失败了。在fragment glsl方法中,我用于计算texel I init的最终颜色,我以如下方式返回变量:vec4 finalColor=vec40.0。稍后,我使用finalColor=diffuseTerm+specularTerm将漫反射项添加到镜面反射项中。但是alpha没有被添加,仍然是0.0。如果我把finalColor.a=diffuseColor.a+specularColor.a这个问题解决了。顺便说一下,我使用的是Adreno 305设备Moto g 2014版本。如果你将alpha初始化为0.0,然后再也不更新它,那么alpha to coverage将清除所有样本的覆盖掩码。完全透明像素=零覆盖。如果要保持完全覆盖,请将alpha值初始化为1.0。谢谢您的回答。据我所知,调用texture2DMaterial.specularTexture时,outTextCoord应该初始化alpha通道,即使纹理没有将其设置为1.0,不是吗?对于unorm纹理,如果图像根本没有alpha通道,纹理调用将返回1.0的alpha,否则将返回纹理中的值。