Android 不同安卓设备上不同的暗影痤疮瑕疵

Android 不同安卓设备上不同的暗影痤疮瑕疵,android,opengl-es,fragment-shader,artifacts,shadow-mapping,Android,Opengl Es,Fragment Shader,Artifacts,Shadow Mapping,我的android opengl项目中的以下着色器函数有问题: highp float calculateShadow(highp float cosTheta, highp vec4 shadowCoord) { highp float bias = 0.005 * sqrt ( 1.0f - cosTheta * cosTheta ) / cosTheta; bias = clamp(bias, 0.0 ,0.01); shadowCoord.z = shadow

我的android opengl项目中的以下着色器函数有问题:

highp float calculateShadow(highp float cosTheta, highp vec4 shadowCoord)
{
    highp float bias = 0.005 * sqrt ( 1.0f - cosTheta * cosTheta   ) / cosTheta;
    bias = clamp(bias, 0.0 ,0.01);
    shadowCoord.z = shadowCoord.z - bias;
    return textureProjOffset(uTextureShadowMap, shadowCoord, ivec2(0,0));
}
此函数用于确定片段是否处于阴影中。第一个参数(cosTheta)按以下方式计算:

float cosTheta = dot(theNormal, fragmentToSun);
Costeta是脸部法线和碎片到太阳方向之间的角度。然后使用Cosheta根据面的坡度来移动偏移量,效果相当不错。 我是从你那儿得到的

但我的问题是:

在配备Exynos CPU的三星Galaxy S7上,我没有暗疮,但在配备Snapdragon 600或855芯片组的设备上,我长了很多暗疮

为什么会有区别?着色器函数应该为偏移计算大致相同的值-无论芯片组是什么。 如何在几乎所有设备上获得相同的结果


(我以前尝试过glPolygonOffset,但几乎每个芯片组的实现方式都不同)

问题可能来自其他设备的解决方案。
如果阴影贴图纹理的分辨率较低,则如果根据设备分辨率定义其分辨率,则阴影贴图纹理的分辨率也会较低。尝试在程序中使用常量值定义阴影贴图纹理大小。

cosTheta是面法线和太阳方向之间角度的余弦。不是角度本身。(与实际问题无关)可能差异在于深度缓冲区的格式。根据硬件的不同,深度缓冲区的格式可能在比特数上有所不同。如果深度缓冲区每个值的位数较少,则必须增加偏移量。请注意,阴影痤疮是由深度缓冲区中的深度相等引起的,相等程度取决于每个值的精度(位数)。@BDL您说得对,谢谢@Rabbid76你是说24位的深度缓冲区并不总是24位的?即使我将其设置为glDepthComponent24?这也为我指明了正确的方向:阴影贴图分辨率现在始终为1024x1024,深度缓冲区始终为24位。最大的错误:着色器中的cosTheta浮点值很低!所有这些加上一些设备具有不同的长宽比,导致了不同的结果。将cosTheta切换到highp已经解决了很多问题。非常感谢你!