首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点灯只照亮半个场景

点灯只照亮半个场景
EN

Computer Graphics用户
提问于 2020-01-21 18:45:19
回答 1查看 103关注 0票数 2

在我的小型3D渲染器中,点灯只照亮了半个场景。我尝试过的每一个场景(会议室、康奈尔盒子等)都会发生这种情况。

我如何调试它呢?有什么不对的?

这是着色器。我没有做任何不寻常的事。光定位在(0,1.0,0)的世界空间。

代码语言:javascript
复制
//
// VERT SHADER
//
#version 410 core

uniform mat4 M;
uniform mat4 V;
uniform mat4 P;

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec3 color;
layout (location = 3) in vec2 texCoords;

out vec3 fWorldPos;
out vec3 fNormal;
out vec3 fColor;
out vec2 fTexCoords;

void main()
{
    mat4 normalMatrix = transpose(inverse(M));

    fWorldPos = vec3(M * vec4(position, 1.0));
    fNormal = normal; // also tested multiplying with normal, M, and MV matrices
    fColor = color;
    fTexCoords = texCoords;

    gl_Position = P * V * M * vec4(position, 1);
}


//
// FRAG SHADER
//
#version 410 core
#define MAX_POINT_LIGHTS 4

struct PointLight {
    float strength;
    vec3 position;
    vec3 color;
    vec3 attenuation;
};

struct Material {
    vec3 color;
};

uniform Material material;
uniform int totalPointLights;
uniform PointLight pointLights[MAX_POINT_LIGHTS];
uniform vec3 cameraPosition;

in vec3 fWorldPos;
in vec3 fNormal;
in vec3 fColor;
in vec2 fTexCoords;

out vec4 color;

float attenuate(float dist, const PointLight light) {
    return light.strength / (light.attenuation.x + light.attenuation.y * dist + light.attenuation.z * dist * dist);
}

//
// MAIN
//
void main()
{
  vec3 normal = normalize(fNormal);

  PointLight light = pointLights[0];

  vec3 lightDir = light.position - fWorldPos;
  float lightDst = length(lightDir);
  lightDir = lightDir / lightDst;

  float att = attenuate(lightDst, light);
  float diffuseFactor = max(dot(normal, lightDir), 0.0);

  color = vec4(material.color * diffuseFactor * att, 1);
}
```
代码语言:javascript
复制
EN

回答 1

Computer Graphics用户

回答已采纳

发布于 2020-01-22 08:46:36

正常值确实是错误的。这是很疯狂的,因为我甚至在Blender登记过他们是正确的(而且他们是正确的)。结果,当加载网格时,我是作为颜色传递正常的,反之亦然。瓦莱汀的正常可视化着色是伟大的(https://vallentin.dev/2015/02/16/visualizing-normals)。

谢谢你的帮忙!

票数 3
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/9505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档