Seite 1 von 1

GLSL Varying

Verfasst: 14.11.2011, 01:08
von Halan
Ahoi,

habe immernoch Probleme mit meinem Terrain Shader. Ich poste ihn erstmal.

Vertex Shader:

Code: Alles auswählen

#version 120

uniform mat4 worldViewProj;
uniform mat3 normalMatrix;
uniform vec3 lightDir;

attribute vec4 vertex;

varying float gras; 
varying float sand;
varying vec3 normal,lightVec;

void main()
{  
   // Text Cord
   gl_TexCoord[0] = gl_MultiTexCoord0;

   // Set the position of the current vertex  
   gl_Position = worldViewProj * vertex;  

   // Calc normal
   normal   = normalMatrix * gl_Normal;
   lightVec = lightDir;

   gras = 1.0f;
   sand = 1.0f;

} 
Frament Shader:

Code: Alles auswählen

#version 120

uniform sampler2D grasMap;
uniform sampler2D sandMap; 

varying float gras; 
varying float sand;
varying vec3 normal,lightVec;

void main()
{   
    // Blend the Textures
    float sum = gras+sand;
    vec4 color  = (sand/sum)*texture2D(sandMap, gl_TexCoord[0].st)+(gras/sum)*texture2D(grasMap, gl_TexCoord[0].st);
    
    // Create lighting
    vec3 n = normalize(normal);
    float diffuse = max(dot(n, normalize(lightVec)), 0.0);
 
    // Set Fragment color 
    gl_FragColor = diffuse*color;
} 
Kurz Erklärung: Also die Per-Pixel-Beleuchtung sollte klar sein. Was ich dnan noch versuche ist eben diese zwei Texturen zu belenden. Je nachdem wie gras und sand im vertex shader gestzt wurden.

Ihr seht richtig. Gras und Sand sind im Vertex Shader konstant. Dh. eigentlich sollte ich immer nur die Grastextur sehen. Was aber passiert ist, dass das Objekt flickert, als würden sich gras und sand dauernd ändern. Ich weiss einfach nicht ob das ein Treiberproblem ist oder ob ich rigend was total falsch mache..

Vor Allem, das ist nicht nur bei diesem Shader so. Sobald ich in einem Shader 'varying' verwende spielt die Ausgabe verrückt, als wär irgendwas bei der Interpolation kaputt oder so. Habe das ganze auch sowohl mit den Open-Source Mesa-Treiber unter Linux als auch mit den proprietären Treibern FGLRX probiert. Die Shaderversion 1.20 ist auch extra definiert, falls ihr euch wundert wieso ich kein 'in' und 'out' verwende.. Die opensource Treiber können nämlich noch kein GLSL 1.30 oder höher.

Bitte helft mir.

Halan

Re: GLSL Varying

Verfasst: 14.11.2011, 05:58
von Artificial Mind
Hi Halan,

So wie du deinen Shader gepostet hat, sollte sand und gras immer 50% gemischt werden. Das Blending sieht eigentlich ok aus, bist du sicher, dass du die Sampler vor dem Rendern richtig setzt?

btw: Gibt es einen Grund, warum du den Lichtvektor per varying übergibst und nicht im Fragment Shader als uniform benutzt?

Re: GLSL Varying

Verfasst: 14.11.2011, 09:42
von Halan
Artificial Mind hat geschrieben:Hi Halan,
So wie du deinen Shader gepostet hat, sollte sand und gras immer 50% gemischt werden. Das Blending sieht eigentlich ok aus, bist du sicher, dass du die Sampler vor dem Rendern richtig setzt?
btw: Gibt es einen Grund, warum du den Lichtvektor per varying übergibst und nicht im Fragment Shader als uniform benutzt?
Wenn ich die Lichtberechnung weglasse und die Farbe direkt ovn einem Sampler übergebe, also z.B.
vec4 color = texture2D(sandMap, gl_TexCoord[0].st);

Dann habe ich eine gleichmässige Texturierung un dkein Flickern. Liegt wohl echt an den varyings. Ich werde die das die Tage einfach mal auf einer anderen Maschine testen.

Re: GLSL Varying

Verfasst: 14.11.2011, 09:58
von joggel
Wenn ich die Lichtberechnung weglasse und die Farbe direkt ovn einem Sampler übergebe, also z.B.
vec4 color = texture2D(sandMap, gl_TexCoord[0].st);
Dann habe ich eine gleichmässige Texturierung un dkein Flickern
Ich könnte mir auch vorstellen, dass etwas schief läuft wenn Du die Sampler setzt.
Das flickern fällt ja nur auf, wenn die Texturen in aufeinanderfolgende Frames wechseln. Denke ich mal...

Re: GLSL Varying

Verfasst: 14.11.2011, 10:39
von Halan
joggel hat geschrieben: Ich könnte mir auch vorstellen, dass etwas schief läuft wenn Du die Sampler setzt.
Das flickern fällt ja nur auf, wenn die Texturen in aufeinanderfolgende Frames wechseln. Denke ich mal...
Das Flickern tritt aber auch auf wenn ich zum Beispiel folgendes schreibe.
vec4 color = gras*texture2D(grasMap, gl_TexCoord[0].st);

Gras ist ja 1.0f, also sollte das funktionieren...

Re: GLSL Varying

Verfasst: 14.11.2011, 10:57
von joggel
:? ... seltsam.

Ich bin ja nicht der Pro in diesen Sachen, aber ich habe ein Frage:
In den Vertexshader setzt du eine varying-Variable auf 1.0f.
Diese werden ja dann im Fragmentshader interpoliert.
Aber wozu?
Und wie werden die dann interpoliert?
Ist aber vlt. etwas off-topic gerade.

Re: GLSL Varying

Verfasst: 14.11.2011, 11:20
von Artificial Mind
@joggel: Bei neuerem OGL kann man das auf jeden fall durch keywords einstellen (smooth oder point interpolation zB) bei 1.2 bin ich mir da nicht genau sicher was default ist.

@Halan: lass dir mal die Werte ausgeben, also mach gl_FragColor = vec4(gras, gras, gras, 1) oder so im fragment shader

Re: GLSL Varying

Verfasst: 14.11.2011, 15:17
von Halan
joggel hat geschrieben:Ich bin ja nicht der Pro in diesen Sachen, aber ich habe ein Frage:
In den Vertexshader setzt du eine varying-Variable auf 1.0f.
Diese werden ja dann im Fragmentshader interpoliert.
Aber wozu?]
Das mache ich ja nur zum Test. Eigentlich soll sie der Wert schon im Vertexshader berechnen. Aber wenn es mit konstantem gras schon nicht geht..

Re: GLSL Varying

Verfasst: 14.11.2011, 15:23
von Halan
Also mit gl_FragColor = vec4(gras,gras,gras,1); sieht das gaze immernoch falsch aus. Müssten ja alles Weiss sein. Ist es aber nicht. Siehe Anhang.

Ich hab hier auch mal mein Material Script falls jemand von euch sich mit OGRE Auskennt. Das müsste eigentlich so stimmen. Und ganz ehrlich, ich fange langsam an daran zu verzweifeln. Der Shader macht ja eig noch garnichts und funktioniert jetzt schon nicht...

Code: Alles auswählen

vertex_program TerrainVert glsl
{
    param_named_auto worldViewProj WORLDVIEWPROJ_MATRIX
    param_named_auto normalMatrix NORMAL_MATRIX
    param_named_auto lightDir LIGHT_DIRECTION 0

    source terrain.vert
}

fragment_program TerrainFrag glsl
{
    source terrain.frag
}

material Terrain
{
	technique
	{
		pass
		{
			lighting off

			vertex_program_ref TerrainVert

    			fragment_program_ref TerrainFrag
			{
        			param_named grasMap int 0
        			param_named sandMap int 1
			}

			texture_unit
       			{
        			texture gras.jpg
        		}

			texture_unit
       			{
        			texture sand.jpg
        		}
		}
	}
}

Re: GLSL Varying

Verfasst: 14.11.2011, 15:56
von Artificial Mind
dein Bild zeigt sehr schön das das Problem woanders liegt :D
Ein paar Vemutungen:
1. der z-Buffer wird nicht gecleart und/oder enthält einfach Müll (schalte mal den z-Test aus)
2. du hast z-Fighting weil du noch was anderes an exakt die gleiche Stelle zeichnest
3. deine Vertexdaten sind Müll (aus irgendeinem Grund)
4. deine Indexdaten sind Müll
Hauptvermutung ist also Datenmüll ;)
Versuch mal rauszufinden was du minimal brauchst um dieses Bug reproduzieren zu können

EDIT: 5. oder deine Linux Treiber sind Müll ;)

Re: GLSL Varying

Verfasst: 14.11.2011, 18:43
von Halan
Artificial Mind hat geschrieben:dein Bild zeigt sehr schön das das Problem woanders liegt :D
Ein paar Vemutungen:
1. der z-Buffer wird nicht gecleart und/oder enthält einfach Müll (schalte mal den z-Test aus)
2. du hast z-Fighting weil du noch was anderes an exakt die gleiche Stelle zeichnest
3. deine Vertexdaten sind Müll (aus irgendeinem Grund)
4. deine Indexdaten sind Müll
Hauptvermutung ist also Datenmüll ;)
Versuch mal rauszufinden was du minimal brauchst um dieses Bug reproduzieren zu können

EDIT: 5. oder deine Linux Treiber sind Müll ;)
Aber ohne das Varying zeichnet er ganz normal! Das ist doch bescheuert.. werd bei gelegenheit das ganze mal auf ner anderen Maschine testen.

Re: GLSL Varying

Verfasst: 17.11.2011, 21:05
von Steo
Hi,

nur ein wild guess:
Halan hat geschrieben: Wenn ich die Lichtberechnung weglasse
Liegt der Fehler evtl in "normalMatrix"? Erzeugst du die selbst, oder willst du die "gl_NormalMatrix" verwenden?