不同 Android 设备上的不同阴影痤疮伪影

Varying shadow acne artifacts on different Android devices

我的 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);

因此,cosTheta 是面部法线与从片段到太阳的方向之间的角度。然后使用 cosTheta 来根据面部的坡度改变偏差 - 它的效果很好。 我从 opengl-tutorial.com.

得到的

但这是我的问题:

在配备 Exynos 的三星 Galaxy S7 上-CPU我没有阴影粉刺,但在配备 Snapdragon 600 或 855 芯片组的设备上我长了很多粉刺。

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

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

问题可能出在您其他设备的分辨率上。 如果它们具有较低的分辨率,如果您根据设备分辨率定义它的分辨率,则阴影贴图纹理也将具有较低的分辨率。尝试在您的程序中使用常量值定义阴影贴图纹理大小。