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.11.2020, 12:26

OpenGL3: Licht in Szene bringen

Hi,

ich habe aktuell eine Wireframe-Darstellung, die korrekt funktioniert. Für die Objekte wird glPolygonMode(GL_FRONT_AND_BACK,GL_LINE) gesetzt und der Fragmentshader ist auch recht simpel, die von außen per "inputColour" gesetzte Farbe wird 1:1 verwendet:

Quellcode

1
2
3
4
5
6
7
8
#version 130
uniform vec4 inputColor;
out vec4 FragColor;

void main()
{
   FragColor=inputColor;
}


Jetzt würde ich das ganze gerne auf eine Solid-Darstellung umbauen. Erster Schritt: glPolygonMode(GL_FRONT_AND_BACK,GL_FILL) setzen. Das Ergebnis ist ein schwarzer Klotz, was mangels Licht auch logisch ist. Zweiter Schritt: den Shader ändern, damit AmbientLight eingesetzt wird (der Code basiert auf dem von https://learnopengl.com/Lighting/Basic-Lighting ):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
#version 130
uniform vec4 inputColor;
out vec4 FragColor;

void main()
{
   float ambientStrength = 0.2;\n"
   vec3 ambient = ambientStrength * lightColor;
   vec3 result = ambient * inputColor;
   FragColor = vec4(result, 1.0);
}


Compilefehler gibt es keine, aber die Objekte sind komplett verschwunden, also noch nicht mal mehr als schwarzer Blob zu sehen!

Was könnte da falsch sein?

UPDATE: Es gibt DOCH einen Compilefehler: "lightColor" ist undefiniert - wenn ich eine feste Lichtfarbe direkt im Shader setzen will, wie mache ich das am cleversten? Danke!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Elmi« (23.11.2020, 12:41)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

23.11.2020, 15:29

Entweder auch als uniform vec3 lightColor;, dann ist sie vom Programm aus einstellbar und im Shader konstant. Oder einfach als Compile Time Constant, also konstant im Shader und auch nicht sichtbar im Programm: const vec3 lightColor = vec3( 0.8f, 0.5f, 0.3f);

Das 'f' hintendran markiert die Zahlen als float, ohne wären sie double. Allerdings hauen Dir das manche ShaderCompiler um die Ohren, wenn ich mich recht erinnere.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

24.11.2020, 13:25

Klappt leider nicht, egal ob mit oder ohne das "f", der Compiler liefert immer diesen Fehler:

Quellcode

1
ERROR: 0:9: error(#162) Wrong operand types: no operation "*" exists that takes a left-hand operand of type "highp 3-component vector of vec3" and a right operand of type "uniform highp 4-component vector of vec4"


Das passiert auch dann, wenn ich aus den beiden vec3 ein vec4 mache...

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

4

24.11.2020, 14:27

Klappt leider nicht, egal ob mit oder ohne das "f", der Compiler liefert immer diesen Fehler:

Quellcode

1
ERROR: 0:9: error(#162) Wrong operand types: no operation "*" exists that takes a left-hand operand of type "highp 3-component vector of vec3" and a right operand of type "uniform highp 4-component vector of vec4"


Das passiert auch dann, wenn ich aus den beiden vec3 ein vec4 mache...

Letzteres bezweifle ich. Die Fehlermeldung sagt doch sehr deutlich, dass es nicht weiß, was '*' bewirken soll, wenn man einen vec3 und einen vec4 kombiniert. Wenn beide Seiten des '*' vec4 sind, müsste dagegen eine elementweise Multiplikation passieren.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

5

24.11.2020, 15:33

Letzteres bezweifle ich


Ja und nein. Ich kann ALLES nach vec4 ändern, inklusive dem hier:

Quellcode

1
const vec4 lightColor = vec4( 0.5f, 0.5f, 0.5f, xxx);


Allerdings wird das verhalten hier dubios: setze ich xxx auf 1.0, so ist das beleuchtete Objekt irgendwie transparent, setze ich es auf 0.0, so wird es undurchsichtig und komplett weiß. Ich hätte jetzt eher ein schwach beleuchtetes, dunkles Objekt erwartet.

Jonathan

Community-Fossil

  • Private Nachricht senden

6

24.11.2020, 18:36

Hast du denn ein solides Verständnis davon, was die einzelnen Komponenten des Vektors überhaupt speichern? Wenn nicht wäre jetzt der richtige Zeitpunkt um es nachzuholen. Dann sollte auch direkt klar sein, wieso das Objekt ggf. transparent wird oder dunkel bleibt.

Generell solltest du dir auch Swizzling mal anschauen. Damit kannst du sowas hier schreiben:

C-/C++-Quelltext

1
vec3 result = ambient * inputColor.rgb;


https://www.khronos.org/opengl/wiki/Data…GLSL)#Swizzling
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige

Ähnliche Themen