Glsl 平行曲面上的漫反射照明错误

Glsl 平行曲面上的漫反射照明错误,glsl,opengl-es-2.0,fragment-shader,Glsl,Opengl Es 2.0,Fragment Shader,作为测试,我创建了一个简单的四边形。以下是它的属性: Vertex vertices[] = { // Positions Normals {vec3(-1,-1, 0), vec3(-1,-1, 1)}, // v0 {vec3( 1,-1, 0), vec3( 1,-1, 1)}, // v1 {vec3(-1, 1, 0), vec3(-1, 1, 1)}, // v2 {vec3( 1, 1, 0), vec3( 1, 1, 1

作为测试,我创建了一个简单的四边形。以下是它的属性:

Vertex vertices[] =
{
    //    Positions        Normals
    {vec3(-1,-1, 0), vec3(-1,-1, 1)}, // v0
    {vec3( 1,-1, 0), vec3( 1,-1, 1)}, // v1
    {vec3(-1, 1, 0), vec3(-1, 1, 1)}, // v2
    {vec3( 1, 1, 0), vec3( 1, 1, 1)}, // v3
};
我把它放在我的世界空间(0.0,0.0,-9.5)。然后我将我的点光源位置设置为(0.0,0.0,-8.0)。我的相机位于原点(0.0、0.0、0.0)。当我运行我的程序时,它会按预期工作:

但是,当我用9个按比例缩小的四边形替换这个四边形时,将它们全部放在Z轴上的-9.5(换句话说,它们在Z轴上彼此平行),我的漫反射照明变得有点奇怪

看起来这些角点显示了太多的照明,打破了我们在常规四边形上看到的漂亮的漫反射圆

这是我的着色器程序:

precision mediump int;
precision mediump float;

varying vec3 v_position;
varying vec3 v_normal;

#if defined(VERTEX)
uniform mat4 u_mvpMatrix;
uniform mat4 u_mvMatrix;
uniform mat3 u_normalMatrix;

attribute vec4 a_position;
attribute vec3 a_normal;

void main()
{
    vec4 position = u_mvMatrix * a_position;
    v_position    = position.xyz / position.w;
    v_normal      = normalize(u_normalMatrix * a_normal);

    gl_Position = u_mvpMatrix * a_position;
}
#endif // VERTEX

#if defined(FRAGMENT)
uniform vec3  u_pointLightPosition;

void main()"
{
    vec3 viewDir                = normalize(-v_position);
    vec3 normal                 = normalize(v_normal);
    vec3 lightPosition          = u_pointLightPosition - v_position;
    vec3 pointLightDir          = normalize(lightPosition);
    float distance              = length(lightPosition);
    float pointLightAttenuation = 1.0 / (1.0 + (0.25 * distance * distance));
    float diffuseTerm           = max(dot(pointLightDir, normal), 0.15);

    gl_FragColor = vec4(diffuseTerm * pointLightAttenuation);
}
#endif // FRAGMENT
我的制服上传如下(我正在使用GLM):

我做错什么了吗


谢谢

不必过多地使用代码,我认为一切都很正常。我在快速搅拌机设置中看到了非常相似的结果:

问题是法线的插值不会产生球形凹凸

它最终是这样一个补丁(我只是细分了一个平滑着色的立方体)


如果您想要一个更为球形的凹凸,可以在片段着色器中隐式生成法线(例如,这样做),使用法线贴图,或使用更多细分的几何体,例如实际的球体。

这很有趣。所以我的着色器没有问题!!谢谢!:)从未想过尝试在Blender中复制此设置。那是个好主意!
const mat4 &view_matrix = getViewMatrix();
mat4 mv_matrix          = view * getModelMatrix();
mat4 mvp_matrix         = getProjectionMatrix() * mv_matrix;
mat3 normal_matrix      = inverseTranspose(mat3(mv_matrix));
vec3 pointLightPos      = vec3(view_matrix * vec4(getPointLightPos(), 1.0f));

glUniformMatrix4fv(   mvpMatrixUniformID, 1, GL_FALSE, (GLfloat*)&mvp_matrix);
glUniformMatrix4fv(    vpMatrixUniformID, 1, GL_FALSE, (GLfloat*)&mv_matrix);
glUniformMatrix3fv(normalMatrixUniformID, 1, GL_FALSE, (GLfloat*)&normal_matrix);
glUniform3f(pointLightPosUniformID, pointLightPos.x, pointLightPos.y, pointLightPos.z);