Matrix 某些三角形上的WebGL着色/照明太暗

Matrix 某些三角形上的WebGL着色/照明太暗,matrix,webgl,lighting,Matrix,Webgl,Lighting,我有一个照明问题,其中一些三角形似乎表现出较差的着色效果,其中着色在整个多边形(例如墙)的整个曲面上不平滑。也就是说,构成多边形的每个三角形的阴影似乎比其相邻三角形的阴影略暗或略亮 我试图实现一个简单的定向照明。下面是它的外观: 下面是顶点着色器代码的内容: gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0); vNormal = vec3(uNMatrix * vec4(aVertexNormal.

我有一个照明问题,其中一些三角形似乎表现出较差的着色效果,其中着色在整个多边形(例如墙)的整个曲面上不平滑。也就是说,构成多边形的每个三角形的阴影似乎比其相邻三角形的阴影略暗或略亮

我试图实现一个简单的定向照明。下面是它的外观:

下面是顶点着色器代码的内容:

gl_Position  = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0);    
vNormal = vec3(uNMatrix * vec4(aVertexNormal.xyz, 1.0));
vColor  = aVertexMaterialColor;
vec3  light   = normalize(vec3( 0.5,  0.2,  1.0));
float amount  = max(dot(vNormal, light),  0.0);
vec4 finalColor = vColor; 
finalColor.rgb *= amount;
gl_Position  = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0);    
vNormal = vec3(uNMatrix * vec4(aVertexNormal.xyz, 1.0));
vColor  = aVertexMaterialColor;
下面是片段着色器代码:

gl_Position  = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0);    
vNormal = vec3(uNMatrix * vec4(aVertexNormal.xyz, 1.0));
vColor  = aVertexMaterialColor;
vec3  light   = normalize(vec3( 0.5,  0.2,  1.0));
float amount  = max(dot(vNormal, light),  0.0);
vec4 finalColor = vColor; 
finalColor.rgb *= amount;
gl_Position  = uPMatrix * uMVMatrix * vec4(aVertexPosition.xyz, 1.0);    
vNormal = vec3(uNMatrix * vec4(aVertexNormal.xyz, 1.0));
vColor  = aVertexMaterialColor;
问题是带窗户的墙呈现出各种带状,其中单个三角形比其他三角形暗。我无法控制得到的几何体,但我相信三角形和法线都定义得很好

uPMatrix是投影矩阵,uMVMatrix是模型视图矩阵,uNMatrix是法线矩阵。以下是如何创建法线矩阵(gl矩阵):

你知道我可能做错了什么,或者我怎样才能使整面墙平滑地着色吗

为了使三角形在其表面上有一些颜色的变化,必须有一些实际变化的输入(嗯,或
gl_FragCoord
,但那是另一回事)。由于您的两个变量
vNormal
vColor
依赖于两个属性,因此必须满足以下条件之一:

  • aVertexMaterialColor
    对于所有三个顶点都不相同
  • aVertexNormal
    对于所有三个顶点都不相同
最有可能的是常态;假设几何体来自文件,则可能是因为没有正确(一致)加载法线,或者没有正确指示建模工具生成平面着色法线

下面是一个调试技巧:

finalColor.rgb = vNormal * 0.5 + vec3(0.5);
这将根据顶点的法线对其着色,而不考虑材质颜色和照明。你会得到奇怪的颜色,但如果你看到任何带有着色颜色的曲面,这些三角形的法线并不完全相同


(任何平面都应该由具有相同法线的三角形组成;此外,这些法线应该垂直于三角形的平面。)

看起来像是经典的顶点照明瑕疵,如果您“无法控制几何体”,您当然应该使用感谢的响应。我来看看这个链接……非常感谢您的回复。我尝试了调试技术,得到了以下结论:我假设“非平面法线”,你的意思是墙的法线不都指向同一方向?这意味着3个顶点的法线不一样……你知道,只要大声思考一下(你的措辞),我想我知道我现在应该去哪里寻找一个潜在的问题(计算法线的代码,我可以控制)。@superqd编辑了一点来澄清。我回到了计算法线的代码,并发现了错误。遗憾的是,我使用了唯一的顶点。计算法线的代码迭代索引并从中获取三角形顶点。但是,由于顶点不重复,这意味着同一个顶点可以用于多个三角形。这意味着该顶点的法线每次都会发生变化。我唯一地存储顶点以节省空间,但我很好奇这种“常用”解决方案是什么。人们通常只是生活在重复的顶点中,因此通常不会有这个问题吗?是的,在任何锐边上,具有相同位置但不同法线的顶点都是典型的。当平滑曲面具有多个三角形(角点或曲面)时,会出现共享顶点