Je projette des ombres sur une texture d'écran en fonction des valeurs d'une autre texture.Striation dans mes ombres
Ma texture « profondeur », ce n'est pas vraiment la profondeur, à des valeurs de couleur qui sont échantillonnées pour des hauteurs, ressemble à ceci:
On peut dire que le canal rouge est mon heightmap.
Je dessine ce à côté d'une texture d'herbe sur un quad en plein écran avec le shader frag suivant:
#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;
}
Un échantillon de la sortie est:
Le strie n'a pas été cherché. Je peux utiliser cette même méthode avec des «bords» plus nets au lieu de contours lisses, et tout semble très bien. Ce sont les gradients comme celui-ci qui causent des problèmes.
Pouvez-vous expliquer ce que vous voulez réaliser et comment fonctionne votre shader? Comprendre cela sans aucun indice est assez difficile. –
@NicoSchertler le shader se dirige vers le soleil; déterminer si le pixel suivant dans cette étape est au-dessus ou au-dessous du pixel original. Si c'est au dessus, on dit que le pixel d'origine doit donc être dans l'ombre et que sa couleur est légèrement plus sombre. L'effet désiré est l'ombre – NeomerArcana
Ne vous éloignez-vous pas du soleil (points de direction du soleil à la position de texel)? La taille du pas ne devrait-elle pas dépendre de 'direction.z' (vous voulez que les étapes' samples' aboutissent à la hauteur maximale)? Votre texture coordonne-t-elle les composantes x/y de la position du monde? Et les hauteurs de la carte représentent-elles directement les hauteurs du monde (sans échelle)? –