【问题标题】:OpenGL ES 2.0 specifying normals for vertex shaderOpenGL ES 2.0 为顶点着色器指定法线
【发布时间】:2011-06-03 20:56:19
【问题描述】:

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

一个不同的脸(我得到想要的边缘),我得到阴影,这样它就可以显示构成那个脸的两个三角形。 我相信问题出在我指定的法线上。我正在附加我的顶点和法线矩阵以及我的顶点和片段着色器代码。顶点和法线矩阵是一样的。

我想问题出在法线上,但我几乎用它们尝试了所有方法,但效果没有改变。

//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;


}

请帮忙?提前致谢!!

【问题讨论】:

  • 你知道,你不应该回答你的问题来详细说明它。我只是偶然偶然发现了你的答案。如果您想就给定答案进行交流,则应该“添加评论”;这样,发帖人就会得到通知并可以回答。然后,对于新的问题材料,通常编辑原始问题以添加更多信息。
  • 您的答案显然已被删除,如果您发布问题的屏幕截图会有所帮助。

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


【解决方案1】:

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

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

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

您可能想看看这个以获得更详细的解释: http://www.songho.ca/opengl/gl_vertexarray.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多