我正在尝试实施各向异性照明。 顶点着色器:
#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);
}
总体而言,照明可以在不同的设备上正常工作。但是,在平板电脑上会出现伪像,如图所示:
似乎最黑暗的地方已经变得完全黑了。任何人都可以请问为什么会这样吗?感谢您的任何回答/评论!