GLSL Varying

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

GLSL Varying

Beitrag 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
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: GLSL Varying

Beitrag 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?
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: GLSL Varying

Beitrag 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.
joggel

Re: GLSL Varying

Beitrag 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...
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: GLSL Varying

Beitrag 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...
joggel

Re: GLSL Varying

Beitrag 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.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: GLSL Varying

Beitrag 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
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: GLSL Varying

Beitrag 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..
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: GLSL Varying

Beitrag 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
        		}
		}
	}
}
Dateianhänge
flicker.png
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: GLSL Varying

Beitrag 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 ;)
Halan
Beiträge: 73
Registriert: 22.01.2005, 21:47
Benutzertext: programmiersüchtig
Echter Name: Kai Mast
Wohnort: Freak City
Kontaktdaten:

Re: GLSL Varying

Beitrag 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.
Steo
Beiträge: 1
Registriert: 17.11.2011, 20:58

Re: GLSL Varying

Beitrag 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?
Antworten