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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

11

01.06.2014, 15:02

Ich hätte aber gerne einen, das muss doch gehen :P

Ignorier mal die Bedingung, selbst ohne, also einfach Textur auslesen, funktioniert nicht.
Im moment kann ich über useTexture ganz oder gar nicht in die depth map schreiben. Fast das was ich will. Wenn useTexture allerdings true ist binde ich auch eine Textur + Texturkoordinaten.

Nochmal:

Quellcode

1
2
3
4
5
6
7
void main(){
    if(useTexture){
        vec4 color = texture(texture0, texCoord); // diese Zeile auskommentieren und es geht "ganz oder gar nicht"
        
        discard;
    }
}


Ich mache ja nichts mit dem Wert, und eigentlich sollte alle Objekte ohne Textur diesen Punkt auch niemals erreichen.
Ich weiß ja nicht was der Compiler daraus macht, aber ohne eine Textur zu binden und ohne den texCoord Buffer zu binden meckert er ja auch nicht.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

12

01.06.2014, 15:38

Ich wäre aber gern Supermillionär, das muss doch gehen. ;)
Die Frage ist halt ob es sinnvoll ist, da bin ich mir nicht so sicher.
Grafikkarten ticken da im Besonderen Maße manchmal ein wenig seltsam auf den ersten Blick.

Soweit ich weiß, ist(oder war zumindest bis vor nicht all zu langer Zeit früher) es üblich, dass Shader so gut wie keine Verzweigungen kannten. Das heißt, es werden einfach alle Befehlswege ausgeführt wurden und erst dann am Ende das "richtige" Ergebnis ausgewählt wurde. ("Conditional Move")
http://www.opengl.org/wiki/GLSL_Sampler#…rm_flow_control

13

01.06.2014, 17:09

Edit: Müll rauseditert.

C-/C++-Quelltext

1
2
3
4
5
 if(useTexture){
        vec4 color = texture(texture0, texCoord); // diese Zeile auskommentieren und es geht "ganz oder gar nicht"
        
        discard;
    }

Sobald useTexture true ist, werden natürlich alle Fragments verworfen.



Edit:
Dein Fehler liegt in der Blend-Function.
Playing.cpp:

C-/C++-Quelltext

1
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


GL_ONE_MINUS_SRC_ALPHA macht natürlich aus dem eigentlich Alpha-Wert deiner Textur einen Opacity-Wert - somit werden alle deine eigentlich opaken Pixel (Alpha == 0.0) zur transparenten Pixeln (Alpha == 1.0) ;)
Du bekommst also 1 Minus den Alpha Wert des Pixels in der Textur in deinem Fragment shader.

Siehe dazu auch msdn (http://msdn.microsoft.com/en-us/library/…v=vs.85).aspx):
GL_ONE_MINUS_SRC_ALPHA (1,1,1,1) - (As / kA , As / kA , As / kA , As / kA )
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »iSmokiieZz« (01.06.2014, 17:32)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

01.06.2014, 17:26

Mit zwei Shadern müsste ich entweder sortieren, während des Durchlaufs durch die Objekte den Shader wechseln, zwei Listen verwenden oder was weiß ich.
Alles davon ist doof und passt nicht gut in mein System. Daher will ich einen Shader mit Schalter: Textur an/aus.

@ISmokiieZz: das stimmt so nicht. Natürlich werden so noch alle Pixel rausgeschmissen, aber das sollte nur für das eine Objekt passieren, nicht für alle (die also false bekommen)!

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1
void main(){
    if(useTexture){
        vec4 color = texture(texture0, texCoord);
        
        discard;
    }
}

// 2
void main(){
    if(useTexture){     
        discard;
    }
}



(Link)


1. Falsch, keine Box hat Schatten, obwohl nur die komische true bekommt.
2. Richtig, schwarze "Box" hat keinen Schatten (die Textur sind diese 2 schwarzen Dinger da). Aber eben auch kein Schatten über die Textur.

Noch einmal was ich will:


(Link)


Dafür wird sicher nicht für jedes Blatt mit Geometrie gerendert.
Also wird wohl der Baum mit Textur gerendert, allerdings erlaubt mir der Shader das Auslesen der Textur nicht. Oder liegt es vielleicht daran dass das FBO kein color attachment hat?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (01.06.2014, 17:33)


15

01.06.2014, 17:38

Siehe meinen Edit oben. Dein Shader liest einen falschen Alphawert ein. (1.0 - 0x0 = 1.0)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

01.06.2014, 17:41

Wenn ich blending deaktiviere und die eine Zeile wieder einfüge (vec4 color = texture(texture0, texCoord)) wird trotzdem nichts in die Textur geschrieben.
Es liegt an der Zeile, ich möchte wissen warum.

Ohne blending, ohne Textur auslesen im Fragment Shader:


(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (01.06.2014, 17:48)


17

01.06.2014, 17:53

Ich meinte nicht, dass du das Blending komplett ausschalten sollst. Die Blend-Func funktioniert liefert dir einfach ein verdrehtes Ergebnis. Somit musst du bei deiner Bedingung prüfen, ob der alpha Wert (nach der Verdrehung der Opacity-Wert) des Fragments 0 ist und nicht 1.

Zu deiner unreferenzierten lokalen Variable hat Spiele Programmierer schon die richtige Seite gegeben, die dir alles erklären sollte.
http://www.opengl.org/wiki/GLSL_Sampler#…rm_flow_control
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Werbeanzeige