OpenGL ES 2.0 / 3.0中的各向异性照明。黑色文物

我正在尝试实施各向异性照明。 顶点着色器:

#version 300 es
uniform mat4 u_mvMatrix; 
uniform mat4 u_vMatrix;

in vec4 a_position; 
in vec3 a_normal; 
...
out lowp float v_DiffuseIntensity;
out lowp float v_SpecularIntensity;

const vec3 lightPosition = vec3(-1.0,0.0,5.0);
const lowp vec3 grainDirection = vec3(15.0,2.8,-1.0);
const vec3 eye_positiion = vec3(0.0,0.0);

void main() {
    // transform normal orientation into eye space
    vec3 modelViewNormal = mat3(u_mvMatrix) * a_normal;
    vec3 modelViewVertex = vec3(u_mvMatrix * a_position);
    vec3 lightVector = normalize(lightPosition - modelViewVertex);
    lightVector = mat3(u_vMatrix) * lightVector;

    vec3 normalGrain = cross(modelViewNormal,grainDirection);
    vec3 tangent = normalize(cross(normalGrain,modelViewNormal));
    float LdotT = dot(tangent,normalize(lightVector));
    float VdotT = dot(tangent,normalize(mat3(u_mvMatrix) * eye_position));
    float NdotL = sqrt(1.0 - pow(LdotT,2.0));
    float VdotR = NdotL * sqrt(1.0 - pow(VdotT,2.0)) - VdotT * LdotT;
    v_DiffuseIntensity = max(NdotL * 0.4 + 0.6,0.0);
    v_SpecularIntensity = max(pow(VdotR,2.0) * 0.9,0.0);
    ...
}

片段着色器:

...
in lowp float v_DiffuseIntensity;
in lowp float v_SpecularIntensity;

const lowp vec3 default_color = vec3(0.1,0.7,0.9);

void main() {
    ...
    lowp vec3 resultColor = (default_color * v_DiffuseIntensity) 
        + v_SpecularIntensity;
    outColor = vec4(resultColor,1.0);
}

总体而言,照明可以在不同的设备上正常工作。但是,在平板电脑上会出现伪像,如图所示:

OpenGL ES 2.0 / 3.0中的各向异性照明。黑色文物

似乎最黑暗的地方已经变得完全黑了。任何人都可以请问为什么会这样吗?感谢您的任何回答/评论!

iCMS 回答:OpenGL ES 2.0 / 3.0中的各向异性照明。黑色文物

您有几个表达有不确定行为的表达:

new.txt==

TEST1,TEST2,TEST3,TEST4,TEST5,TEST6

如果x为负,则sqrt(1.0 - pow(LdotT,2.0)) sqrt(1.0 - pow(VdotT,2.0)) 函数未定义。我怀疑您会因为y为2.0而无法使用它,因此它们可能已优化为x * x。

如果x为负,则pow函数未定义。从数学上讲,这是不应该的,因为两个归一化向量的点积的大小永远不应该大于1,但是计算总是有误差的。我认为这是造成您的渲染产物的原因。

我将这两个表达式更改为:

sqrt

该代码看起来很丑陋,但是更安全,sqrt(max(0.0,1.0 - pow(max(0.0,LdotT),2.0))) sqrt(max(0.0,VdotT),2.0))) 是一个非常便宜的操作。

编辑:刚刚注意到max(0.0,x),我也会对此进行更改。

本文链接:https://www.f2er.com/2156029.html

大家都在问