我一直在尝试正确生成3D图形,如平面,球体和立方体。但我正试图对它们应用光照,所以我也会生成法线。
这是我从一个简单的平面输出,我只使用三角形而我正在使用位置光:
Vertice 0: 3.000000 3.000000 0.000000
Vertice 1: 3.000000 -3.000000 0.000000
Vertice 2: -3.000000 -3.000000 0.000000
Vertice 3: -3.000000 3.000000 0.000000
Normal: 0.000000 0.000000 1.000000
Normal: -0.000000 0.000000 1.000000
这是结果:
有时会点亮它,有时会以这种方式显示,有两个可怕的三角形。
您认为这可能是什么原因?
这是顶点着色器:
attribute highp vec4 vertices;
attribute highp vec3 normals;
uniform mediump mat4 projectMatrix;
uniform mediump mat4 viewMatrix;
uniform mediump mat4 modelMatrix;
out highp vec3 normal;
out highp vec4 pos_ws;
out lowp vec4 lightp_cs;
void main (void)
{
vec4 PPos= vec4(3.0, 3.0, 3.0, 1.0);
gl_Position= projectMatrix*viewMatrix*modelMatrix*vertices;
normal= normals;
pos_ws= viewMatrix*modelMatrix * vec4(vertices);
lightp_cs= viewMatrix* PPos;
}
这是片段着色器:
in highp vec3 normal;
in highp vec4 pos_ws;
in lowp vec4 lightp_cs;
void main(void)
{
vec4 ambient= vec4 (0.276, 0.342, 0.417, 1.0);
vec4 DiffuseColor= vec4 (0.40234375, 0.40234375, 0.40234375, 1.0);
vec4 PColor= vec4(0.7, 0.7, 0.7, 1.0);
//vec4 PPos= vec4(3.0, 3.0, 3.0, 1.0);
vec3 PAtt= vec3(0.6, 0.050, 0.005);
// Para la luz puntual
//vec4 vToLight= pos_ws - PPos;
vec4 vToLight= pos_ws - lightp_cs;
vToLight= normalize(vToLight);
float distToLight= length(vToLight);
vec4 Vnormal= vec4(normal, 1.0);
float cosNPL= clamp(dot(Vnormal, -vToLight), 0, 1);
float PLAtt= (PAtt.x + PAtt.y * distToLight + PAtt.z * distToLight * distToLight);
gl_FragColor= ambient + (DiffuseColor * (cosNPL * PColor)/PLAtt); // Luz Puntual
}
答案 0 :(得分:0)
现在已经解决了。
datenwolf是对的。我只是在考虑面部的法线,因为我开始计算并给出了顶点法线的opengl,正确地渲染了平面。
我还会考虑Spektre的回答,我猜你在谈论正常的矩阵。我也会这样做。
由于我只是在生成一架飞机,所以当我开始生成一个球体时,真正的挑战就会出现。我也不知道你传递法线的顺序是否有任何差别(面法线,顶点法线,f,v,f,f,v等),我认为它没有。
无论如何,谢谢大家! :)