【问题标题】:Wrong and weird lightning on a very simple mesh一个非常简单的网格上的错误和奇怪的闪电
【发布时间】:2014-03-06 01:36:47
【问题描述】:

我一直在尝试正确生成 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

结果如下:

有时它会点亮它,有时它会以这种方式显示,带有 2 个明显的三角形。

你认为这可能是什么原因?


这是顶点着色器:

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
}

【问题讨论】:

  • 如何渲染三角形? v0 v1 v2v2 v0 v3?或v0 v1 v2v1 v2 v3?
  • 您能否至少给出代码的相关部分,或者更严格地描述您是如何生成此图像的?
  • 我按下一个顺序渲染它们:V0、V2 和 V1,然后是 V3、V2 和 V0,所以它会是 CCW。我还将使用顶点和片段着色器编辑问题...
  • 看起来你为渲染提供了错误或垃圾的法线,例如通过在 VAO/VBO 中使用错误的偏移量。
  • 我会尽快检查并发布结果!谢谢!

标签: opengl shader normals


【解决方案1】:

现在解决了。

datenwolf 是对的。我只考虑面的法线,因为我开始计算并将顶点的法线提供给opengl,因此平面被正确渲染。

我还会考虑 Spektre 的回答,我猜你是在谈论正常矩阵。我也会这样做的。

由于我只是生成一个平面,真正的挑战将在我开始生成一个球体时出现。我也不知道你通过法线的顺序是否有任何区别(面法线、顶点法线、f、v、f、f、v 等),我认为没有。

无论如何,谢谢大家! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多