我正在基于其他纹理中的值投射阴影。我的阴影中的条纹
我的“深度”的质感,它不是真正的深度,这是为高采样只是颜色值,如下所示:
我们可以说,红色通道是我的高度图。
我就用下面的frag着色器全屏四画这个旁边一个草质地:
#version 400
layout(location=0) out vec4 frag_colour;
in vec2 texelCoords;
uniform sampler2D uTexture;
uniform sampler2D uTextureHeightmap;
uniform float uSunDistance = -10000000.0;
uniform float uSunInclination;
uniform float uSunAzimuth;
uniform float uQuality;
void main()
{
vec4 c = texture(uTexture,texelCoords);
vec2 textureD = textureSize(uTexture,0);
float d = max(textureD.x,textureD.y);
float aspectCorrection = textureD.x/textureD.y;
vec3 sunPosition = vec3(textureD.x/2,textureD.y/2,0) + vec3( uSunDistance*sin(uSunInclination)*cos(uSunAzimuth),
uSunDistance*sin(uSunInclination)*sin(uSunAzimuth),
uSunDistance*cos(uSunInclination) );
vec4 heights = texture(uTextureHeightmap, texelCoords);
float height = max(max(heights.r,heights.g),heights.b);
vec3 direction = normalize(vec3(texelCoords,height) - sunPosition);
direction.y *= aspectCorrection;
float sampleDistance = 0;
float samples = d*uQuality;
float stepSize = 1.0/((samples/d) * d);
for(int i = 0; i < samples; i++)
{
sampleDistance += stepSize;
vec3 newPoint = vec3(texelCoords,height) + direction * sampleDistance;
if(newPoint.z > 1.0)
break;
vec4 h = texture(uTextureHeightmap,newPoint.xy);
float base = h.r;
float middle = h.g;
float top = h.b;
if(newPoint.z < base)
{
c *= 0.5;
break;
}
if(newPoint.z >= middle && newPoint.z <= top)
{
c *= 0.5;
break;
}
}
frag_colour = c;
}
输出的样本是:
的条纹不想要的。我可以用更清晰的“边缘”代替平滑轮廓的相同方法,并且一切看起来都很棒。像这样的梯度会导致问题。
你能解释你想要达到什么样的着色器吗?在没有任何提示的情况下搞清楚是非常困难的。 –
@NicoSchertler着色器正沿着朝向太阳的方向前进;确定该步骤中的下一个像素是高于还是低于原始像素。如果它在上面,它表示原始像素必须处于阴影中,并将其设置为稍暗的颜色。 期望的效果是阴影 – NeomerArcana
您是不是正在远离太阳(“方向”从太阳指向texel位置)?步长不应该依赖于'direction.z'(你想'样本'步骤导致最大高度)?您的纹理是否协调世界位置的x/y分量?地图高度是否直接代表世界高度(没有任何缩放比例)? –