Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Apr 17, 2024 00:11

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 18, 2015 09:21 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
Hallo,
ich versuche mich gerade mit Shadern anzufreunden (was mehr oder weniger erfolgreich ist/war).

Es war immerhin soweit erfolgreich, dass ich die Shader erfolgreich laden und benutzen kann, jedoch rendert mein Programm nun den durchsichtigen Bereich einer Textur mit Alphakanal.
Die "Blätter" sind triangulierte Quads mit einer darauf gebundenen Textur.

Man sollte auf dem Bild erkennen, dass z.B bei dem Quad rechts ab einer gewissen Stelle das komplette Quad gerendert wird - anstatt eben nur den sichtbaren Teil.

Bild

Warum ist das so? Kann es evt sein, dass dies an dem Shader an sich liegt? Ohne Shader funktioniert alles ohne Probleme. Den Shader habe ich von hier: Shader


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 18, 2015 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Wie durchsichtig ein Fragment ist, hängt vom Alphawert von gl_FragColor ab. Schauen wir uns die entscheidende Zeile des Fragmentshaders an:
Code:
  1. gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * texture2D(Texture0, vec2(gl_TexCoord[0])) + ISpecular);

Im Grunde steht da nichts anderes als
gl_FragColor = licht * texturWert + specular
Wenn der Alphawert in der Textur 0 ist, willst du ja, dass er es auch im Endergebnis ist. Das ist bei obiger Formel offensichtlich nicht immer der Fall, weil der Alphawert von ISpecular immer noch draufaddiert wird. Du hast also zwei Möglichkeiten:

1.) Du setzt den Alphawert (die w-Komponente) von ISpecular auf 0:
Code:
  1. gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * texture2D(Texture0, vec2(gl_TexCoord[0])) + vec4(ISpecular.xyz, 0.0));

2.) Du nimmst ISpecular mit in den Vorfaktor des Texturwertes auf:
Code:
  1. gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse + ISpecular) * texture2D(Texture0, vec2(gl_TexCoord[0])));

Das Ergebnis der beiden Möglichkeiten ist nicht das selbe! Entscheide dich für das, was deiner Meinung nach besser aussieht.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 18, 2015 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Das Problem hatte ich auch, ich habe einfach den Alpha-Kanal vor der Lichtberechnung gesichert und anschliessend zurückgeschrieben.

Code:
  1.     out vec4 OutColor;
  2.       .....
  3.       float cdummy = OutColor.a;
  4.       OutColor = OutColor * Light();
  5.       OutColor.a = cdummy;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 18, 2015 18:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Eigentlich gibt es sowieso keinen Grund, den Alphakanal in den Lichtberechnungen die ganze Zeit mitzuschleppen. Zu Fixed-Function-Zeiten hatte man halt Recheneinheiten, die sowieso mit jedem Takt 4 floats verarbeitet haben. Daher stammt wohl dieses Beleuchtungsmodell, das hier genutzt wird.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.052s | 17 Queries | GZIP : On ]