Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.05.2013, 22:30

GLSL: Merkwürdige Artifakte

Hi Leute,

bin gerade am Experimentieren mit GLSL und versuche mich gerade an Punktlichtern. Ich schaffe es nun mehrere hinzubekommen(also zwei mit verschiedenen Farben u.s.w.), jedoch nur mit diesem statischen Code:

"final = finalLight1 + finalLight2;"


..wobei "finalLight1" und "finalLight2" eben die berechneten Fragmentfarben für die einzelnen(in diesem Fall zwei) Punktlichter darstellen. So bekomme ich wie gewünscht folgendes Ergebnis:


(Link)




Und hier habe ich nun den "fehlerhaften" dynamischen Code, damit ich eben eine dynamische Anzahl an Punktlichtern zeichnen kann:

"final += finalLight(i)";

...wobei hier "finalLight(i)" wieder eben die einzelnen Fragmentfarben darstellen. Hier bekomme dieses Bild:


(Link)



Wahrscheinlich ist das irgendein einfacher Fehler, von dem ich nur nichts weiß :D
Falls ihr zur Diagnose den ganzen Code braucht, nur sagen;)

MfG
RenX

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

2

23.05.2013, 22:42

Wir brauchen den ganze Code (des Shaders) ;)

3

23.05.2013, 22:57

Hab gehofft das vermeiden zu können, denn der ist ziemlich unsauber geschrieben im Moment :D


vec3 calcPointLights(vec3 texeldiff, vec3 texelspec, vec3 texelnorm){
vec3 finalLight;
for(int i = 0; i < pointLightsCount; i++){
vec3 lightPosition = pointLightsPos;
float lightRadius = pointLightsRad[i];
float distanceToLight = distance(lightPosition, absolutePosition.rgb);

vec3 L = lightPosition - absolutePosition.rgb;
L /= distanceToLight;

vec3 h = normalize(normalize(cameraPosition.rgb - absolutePosition.rgb) + L);


float attenuation = 1 / (1 + ((2 / lightRadius) * distanceToLight) + ((1 / (pow(lightRadius, 2))) * pow(distanceToLight, 2)));

finalLight += (attenuation * pointLightsPow[i]) * dot(L, outNormal.rgb * texelnorm) * (1+ pow(clamp(dot(h, outNormal.rgb * texelnorm),0.0,1.0), 20) * (texelspec*10)) * pointLightsCol[i];
}
return finalLight;
}

Also das hier ist der fehlerhafte Code. Und hier der Funktionierende:


[/i][/i][/i]

C-/C++-Quelltext

1
vec3 calcPointLights(vec3 texeldiff, vec3 texelspec, vec3 texelnorm){   vec3 finalLight[2]; for(int i = 0; i < pointLightsCount; i++){      vec3 lightPosition = pointLightsPos[i];     float lightRadius = pointLightsRad[i];      float distanceToLight = distance(lightPosition, absolutePosition.rgb);          vec3 L = lightPosition - absolutePosition.rgb;      L /= distanceToLight;           vec3 h = normalize(normalize(cameraPosition.rgb - absolutePosition.rgb) + L);               float attenuation = 1 / (1 + ((2 / lightRadius) * distanceToLight) + ((1 / (pow(lightRadius, 2))) * pow(distanceToLight, 2)));          finalLight[i] = (attenuation * pointLightsPow[i]) * dot(L, outNormal.rgb * texelnorm) * (1+ pow(clamp(dot(h, outNormal.rgb * texelnorm),0.0,1.0), 20) * (texelspec*10)) * pointLightsCol[i];    }   return finalLight[0] + finalLight[1];}
[i][i][i]
[/i][/i][/i]

Wieso kann ich den Code nicht richtig einfügen?!?! (Aus Notepad++)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »RenX313« (23.05.2013, 23:21)


4

23.05.2013, 23:07

Bitte benutze Code-Tags...
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

23.05.2013, 23:24

Worauf wird eine uninitialisierte Variable in GLSL gesetzt? Die einzige Operation mit finalLight ist += bevor der Inhalt dieser Variable zurückgegeben wird.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

6

23.05.2013, 23:31

Danke sehr Legend :D
Hab finalLight jetzt auf "vec3(0,0,0);" initialisiert und es klappt :) Immer diese kleinen Fehler -.-

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

24.05.2013, 07:31

Wieso kann ich den Code nicht richtig einfügen?!?! (Aus Notepad++)

Vermutlich bist Du beim Schreiben Deines Beitrags im "Editor" Modus. Das ist das Tab über dem Eingabe-Feld. Bitte wähl da "Quellcode" aus, dann funktioniert das auch tadellos.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige