Could not link the shader

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Could not link the shader
Also ich habe so ein Problem. Ich wollte, dass die Teile des Terrains, die unter dem Wasser liegen nur mit Sand texture texturiert sind. Dafür habe ich eine uniform float variable waterplane, die die Z-Koordinate der Wasseroberfläche gleich ist.
Also um zu wissen, welche Teile unter Wasser liegen, vergleiche ich im Vertex shader, die z coordinate vom Vertex und Waterplane, ich habe eine varying float is_underwater:
Also Vertex shader:
vec3 vertex3 = gl_Vertex.xyz;
if (vertex3.z < waterplane) is_underwater = 1.0;
else is_underwater = 0.0;

dann im Fragment shader:
if (is_underwater > 0)
{
color = texture2D(sand, XY).rgb;
gl_FragColor = vec4(color *
( diffuse * gl_LightSource[0].diffuse
+ gl_LightSource[0].ambient * ambient
+ specular * gl_LightSource[0].specular), 1.0);
}
ich bekomme aber immer could not link the GLSL programm, could not link shader… Was kann da falsch sein.

re
Pack doch mal die entsprechenden Stellen mit Zeilennummern hier rein und poste die Fehlermeldung dazu - da steht dann nämlich drin, in welcher Zeile der Fehler auftritt.


Poste doch bitte deinen ganzen Shader, z.B. geht aus den Schnipseln nicht hervor, ob

XY,
color

unbekannt sind oder weiter oben definiert werden.

Gruss, Jochen

GraPA-Team


es gibt keine Fehlermeldung.
XY geht bei normalen Lauf.
ich mache einfach
if (is_underwater > 0)
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);

gibt die gleiche Meldung. Keine errors, keine warnings, einfach could not link shader etc. und kein Terrain…


also ich habe commit gemacht. Das ganze steht im Terrain.frag Terrain.vert, also bitte an Grapa-Betreuer das kurz anzuschauen.


wenn, jemand die Zeit dafür hat :blush:


Dieser Fehler tritt manchmal auf wenn man unterschiedliche dimensionen bei vektoren/matrizen hat und diese dann multipliziert.

vec3 blah = gl_BlubMatrix * vec3(bar);
sowas in der art. hab grad kein passendes beispiel.

auf der 3D Labs Seite gibts ein GLSLValidate Programm, das hilft auch “saubere” shader zu schreiben.
ansonsten kannst du discard zeile fuer zeile nach unten setzen oder auskommentieren bis du den fehler findest.

Mfg Henry


also wenn ich

if (is_underwater > 0)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);

}

auskommentiere, dann gibt es kein Fehler. ich verstehe nicht, warum dieses Code den Fehler verursacht.


was ist denn is_underwater fuern typ? float, int, vecX?


ich mach eim vertex shader
varying float is_underwater;

vec3 vertex3 = gl_Vertex.xyz;
if (vertex3.z < waterplane) is_underwater = 1.0;
else is_underwater = 0.0;


uniform float waterplane


setzt du auf jeden fall die gl_FragColor? also auch wenn du nicht im if bist?

im if verwende besser is_underwater > 0.0


ja
else
gl_FragColor = outputcolor;
mit 0.0 ist auch nicht besser geworden…


was sagt denn glslvalidate?


jetzt geht, ich habe ein teil auskommentiert, der offensichtlich mit meinem Teil Probleme hat und zwar
if (gl_TexCoord[7].q > 0)
{
vec4 headlights = texture2DProj(headlightTexture, vec4(gl_TexCoord[7]));
float intensity = length(outputcolor.rgb);
const float SQRT_3 = length(vec3(1.0));
float diff = (SQRT_3 - intensity) / SQRT_3 / 2;
if (length(headlights) > 0.3 )
outputcolor.rgb += headlights.rgb * diff;
}
warum habe ich jetzt Probleme mit meiner Teil: keine Ahnung, aber ohne das Stück geht


dann geht Scheinwerfer nicht…


Keine Ahnung ob das damit was zu tun hat:
Die Nvidia Treiber haben den Fehler, dass bei einem deutschen Linux keine Kommazahlen in den Shadern funktionieren, dann geht zwar das Kompilieren, aber Linken geht nicht. Mit export LANG=C funktionierts dann.

Das faellt natuerlich keinem auf, weil unter Linux meistens sowieso keine Grafik geht.

Edit: Mit Kommazahlen meine ich Sachen wie 0.3 oder 3.0/2.0. 1.0 und 2.0 funktionieren.