OpenGL ES 2.0为顶点着色器指定法线

时间:2011-06-03 20:56:20

标签: xcode4 ios-simulator opengl-es-2.0

我无法在我绘制的立方体的所有面上获得正确的阴影。我从一个面部到另一个面部平滑过渡,没有正确显示边缘。

一张不同的脸(我得到了所需的边缘),我得到了阴影,使得它显示了构成那张脸的两个三角形。 我认为问题在于我指定的法线。我附加了我的顶点和普通矩阵以及我的顶点和片段着色器代码。顶点和法线矩阵是一样的。

我想这个问题与法线有关,但我几乎用它们尝试了一切,但效果并没有改变。

//normal matrix and vertex matrix are same

static const float normals[]=

    {
         //v0,v1,v2,v3,
         //v4,v5,v6,v7
        0.5,0.5,0.5, -0.5,0.5,0.5, -0.5,-0.5,0.5, 0.5,-0.5,0.5, 

        0.5,0.5,-0.5, -0.5,0.5,-0.5, -0.5,-0.5,-0.5, 0.5,-0.5,-0.5 

    };

//vertex shader

attribute vec4 color;
attribute vec4 position; 

attribute vec4 normal;

uniform mat4 u_mvpMatrix;
uniform vec4 lightDirection;
uniform vec4 lightDiffuseColor;
uniform float translate;

varying vec4 frontColor;



//varying vec4 colorVarying;



void main()

{

   vec4 normalizedNormal = normalize(u_mvpMatrix* normal);
   vec4 normalizedLightDirection = normalize(lightDirection);

   float nDotL = max(dot(normalizedNormal, normalizedLightDirection), 0.0);


   frontColor =  color * nDotL * lightDiffuseColor;


  gl_Position = u_mvpMatrix * position;


}

//fragment shader

varying lowp vec4 frontColor;

void main()
{


        gl_FragColor = frontColor;


}

请帮帮忙?在此先感谢!!

1 个答案:

答案 0 :(得分:2)

您的问题与您的正常矩阵无关,它与您的输入法线有关。

根据我的阅读,你提供8个法线,每个顶点一个法线,意味着你提供预平均法线;你的顶点着色器无法取消它们的平均值。

要使光照中存在适当的不连续性,您需要不连续的法线:对于每个四边形,您有4个顶点,每个顶点都与法线符合法线匹配。所以你最终得到6x4 = 24个法线(以及许多顶点)。

您可能需要查看此内容以获取更详细的说明: http://www.songho.ca/opengl/gl_vertexarray.html