【发布时间】:2016-02-24 14:31:53
【问题描述】:
我正在我的地形上进行逐像素光照(phong 着色)。我使用高度图来生成地形高度,然后计算每个顶点的法线。法线在片段着色器中被插值并被归一化。
我在不应该出现的三角形边缘附近出现了一些奇怪的黑线。 http://imgur.com/L2kj4ca
我检查了法线是否正确,使用几何着色器在地形上绘制法线,它们似乎是正确的。 http://imgur.com/FrJpdXI
对地形使用法线贴图毫无意义,它只会提供几乎相同的法线。问题在于法线在三角形上的插值方式。
我不知道如何解决这个问题。我在网上找不到任何可行的解决方案。
地形顶点着色器:
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 textureCoords;
out vec2 pass_textureCoords;
out vec3 surfaceNormal;
out vec3 toLightVector;
out float visibility;
uniform mat4 transformationMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
uniform vec3 lightPosition;
const float density = 0.0035;
const float gradient = 5.0;
void main()
{
vec4 worldPosition = transformationMatrix * vec4(position, 1.0f);
vec4 positionRelativeToCam = viewMatrix * worldPosition;
gl_Position = projectionMatrix * positionRelativeToCam;
pass_textureCoords = textureCoords;
surfaceNormal = (transformationMatrix * vec4(normal, 0.0f)).xyz;
toLightVector = lightPosition - worldPosition.xyz;
float distance = length(positionRelativeToCam.xyz);
visibility = exp(-pow((distance * density), gradient));
visibility = clamp(visibility, 0.0, 1.0);
}
地形片段着色器:
#version 330 core
in vec2 pass_textureCoords;
in vec3 surfaceNormal;
in vec3 toLightVector;
in float visibility;
out vec4 colour;
uniform vec3 lightColour;
uniform vec3 fogColour;
uniform sampler2DArray blendMap;
uniform sampler2DArray diffuseMap;
void main()
{
vec4 blendMapColour = texture(blendMap, vec3(pass_textureCoords, 0));
float backTextureAmount = 1 - (blendMapColour.r + blendMapColour.g + blendMapColour.b);
vec2 tiledCoords = pass_textureCoords * 255.0;
vec4 backgroundTextureColour = texture(diffuseMap, vec3(tiledCoords, 0)) * backTextureAmount;
vec4 rTextureColour = texture(diffuseMap, vec3(tiledCoords, 1)) * blendMapColour.r;
vec4 gTextureColour = texture(diffuseMap, vec3(tiledCoords, 2)) * blendMapColour.g;
vec4 bTextureColour = texture(diffuseMap, vec3(tiledCoords, 3)) * blendMapColour.b;
vec4 diffuseColour = backgroundTextureColour + rTextureColour + gTextureColour + bTextureColour;
vec3 unitSurfaceNormal = normalize(surfaceNormal);
vec3 unitToLightVector = normalize(toLightVector);
float brightness = dot(unitSurfaceNormal, unitToLightVector);
float ambient = 0.2;
brightness = max(brightness, ambient);
vec3 diffuse = brightness * lightColour;
colour = vec4(diffuse, 1.0) * diffuseColour;
colour = mix(vec4(fogColour, 1.0), colour, visibility);
}
【问题讨论】:
-
我的地形图块的三角剖分方式如下:imgur.com/t8DOkTJ 我尝试了另一种三角剖分方法,但在三角形边缘附近出现了不同的暗线。我在我的地形上寻找的效果是这样的:imgur.com/9Jx2g24 This is from vanilla wow.
-
请再提供两个图像:几何线框 + 法线从像素着色器中编码为颜色。这应该让我们更接近解决方案。
-
我很抱歉 mrVoid 你是什么意思?绘制法线向量的几何着色器和片段着色器代码?
-
他的意思是用
surfaceNormal作为color的值,将顶点的法线转化为颜色分量。 -
我用这段代码来可视化法线向量:learnopengl.com/#!Advanced-OpenGL/Geometry-Shader 向下滚动到“可视化法线向量”