gpt4 book ai didi

ios - GLSL ES Phong 着色器结果中的设备/操作系统不一致

转载 作者:可可西里 更新时间:2023-11-01 04:54:07 25 4
gpt4 key购买 nike

Apple's Best Practices for OpenGL ES建议不要对在片段着色器中计算的结果进行分支。但是Phong shading当光源在表面的“错误”一侧时,通常涉及跳过镜面反射项,对于这种情况,直接的方法是点单位法线方向 N 和光方向 L 并检查是否有阳性结果。

我试图在我的着色器中没有分支的情况下这样做:我没有使用 if 语句,而是对镜面反射项进行了所有计算,然后给它一个系数 1.0 如果 dot(N, L) 大于零,否则为 0.0。 (我使用内置的 step() 函数实现了这一点。结合 max()sign() 产生相同的结果,但据说是有点慢。)

但是,这似乎会导致奇怪的、特定于设备和/或 iOS 版本的结果:

with branch without branch

  • 在我运行 iOS 6.0 的 iPhone 4 上,有分支的版本有一个很宽的镜面高光(左图);在没有分支的情况下,我看到了一个狭窄的镜面高光(右图),尽管“反光度”指数保持不变。
  • 在 iOS 6.0 模拟器上,我看到第二张图片包含两个版本的着色器。
  • 在我的 iPad(最初的 2010 型号,停留在 iOS 5.1)上,我看到了第一张包含两个版本着色器的图像。

显然,问题不在于分支或缺少分支。 (顺便说一下,右边的图像是“正确”的渲染。)

这是我的片段着色器:

precision mediump float;

uniform lowp vec3 ambientLight;
uniform lowp vec3 light0Color;
uniform lowp vec3 materialAmbient;
uniform lowp vec3 materialDiffuse;
uniform lowp vec3 materialSpecular;
uniform lowp float materialShininess;

// input variables from vertex shader (in view coordinates)
varying vec3 NormDir;
varying vec3 ViewDir;
varying vec3 LightDir;

void main (void)
{
vec3 L = normalize(LightDir);
vec3 N = normalize(NormDir);
vec3 E = normalize(ViewDir);

lowp vec3 ambient = ambientLight * materialAmbient;

float cos_theta = dot(L, N);

lowp vec3 diffuse = materialDiffuse * light0Color * max(0.0, cos_theta);

lowp vec3 specular = vec3(0.0, 0.0, 0.0);
// if (cos_theta > 0.0) {
lowp vec3 R = reflect(-L, N);
lowp vec3 V = normalize(-E);
float cos_alpha = dot(R, V);
specular = step(0.0, cos_theta) * materialSpecular * light0Color * pow(max(0.0, cos_alpha), materialShininess);
// ~~~~~~~~~~~~~~~~~~~~~~
// should produce the same results as the commented branch, right?
// }
gl_FragColor = vec4(ambient + diffuse + specular, 1.0);
}

我也欢迎就改进此着色器在 iOS 硬件上的性能提出进一步的建议!

最佳答案

如@BradLarson 的评论所述,materialShininess 上的lowp 限定符原来是问题所在;相反,将其设置为 mediump,它可以在我手头的所有设备和操作系统版本上正确呈现(右图),无论是分支还是无分支(使用 step) 版本的着色器被使用。

(使用 lowpmediump 作为输入 RVcos_alpha 的计算结果没有任何明显的差异,这是有道理的:这些是​​归一化向量,因此它们的分量的幅度在 0.0 到 1.0 的范围内。这与颜色分量的范围相同,lowp 似乎是故意的。)

关于ios - GLSL ES Phong 着色器结果中的设备/操作系统不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com