Du bist nicht angemeldet.

Werbeanzeige

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 514

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

1

11.07.2011, 18:22

OpenGL und Shader

Hallo Leute,

derzeit arbeite ich mich in OpenGL 4.x ein. Beziehungsweise 3.x, da ich noch keine wirklichen Features aus. OpenGL 4 benutze. Ich stehe noch ziemlich am Anfang und bin am überlegen wie man das Darstellen von mehreren Objekten am Besten regelt.
Da es recht schwer ist an Anfängerinformationen zu kommen, die mit den neueren OpenGL Versionen kompatibel sind, dachte ich mir, ich frage mal hier nach Erfahrungen und Tipps.
Bisher habe ich einen Vertex und einen Fragment Shader und 1-x Objekte. Die Frage die ich mir stelle, wie soll das ganze aufgebaut werden?
Soll ich die Shader für jedes Objekt kompilieren, die Word und Perspective-Matrizen mit uniform einbinden und dann beim Move Vorgang die Model Matrix anpassen oder das Shaderprogramm einmal binden, den Objekten mitgeben und für jedes Objekt die Model-Matrix anpassen?
Oder sollte man das ganz anders machen?
Wenn die Fenstergröße geändert wird (was ja nicht oft vorkommt, aber wer weiß), muss ja auch der Viewport und die Projection-Matrix angepasst werden. Der Viewport ist lokal, aber die Projection Matrix in jedem Shader vorhanden? Ich bin wie gesagt etwas verwirrt, wie man gescheit mehrere Objekte handelt, ohne dass es zu überschneidungen kommt. Die Performance ist natürlich auch ein mehr oder minder wichtiger Aspekt (mich interessiert was die gängigere und effizientere Methode ist, wie teuere ist zum Beispiel das binden eines Shaders?).
Wenn jemand noch gute Informationen für Einsteiger hat, bin ich auch dankbar. Die OpenGL Manpages wühle ich schon durch, genauso wie die in der OpenGL-Wiki verlinkten Tutorials.
Ich nutze derzeit Visual C++ 2010 mit SFML 2.0 als Basis. Zusätzliche Bibliotheken sind GLEW und GLM (für Matrizen, Vectoren, etc.).

Viele Grüße,
Skalli

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »MCP« (11.07.2011, 19:52)


BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

11.07.2011, 20:04

Shader bitte nur einmal kompilieren. Alles andere ist unnötige Verschwendung von Speicher und Compile-Zeit.
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]

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

3

11.07.2011, 20:08

Ein Program-Object und vor jedem Rendern die Uniforms entsprechend setzen. In OpenGL 3.x und 4.x gibts Uniform-Blocks, damit kannst du mit Uniforms sehr effizient umgehen.

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 514

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

4

11.07.2011, 23:01

Also quasi mein Programm mit den Shadern kompilieren und linken und dann in der Render-, bzw. Move-Funktion das Programm binden, die Projection- und View Matrizen setzen und dann für jedes Objekt die Model Matrix? Klingt soweit vernünftig. Die Uniform-Blocks kenne ich noch nicht, da schaue ich morgen mal in der Doku nach. Die View Matrix ist im Prinzip doch das gleiche wie eine World Matrix, oder sehe ich das falsch? Der Blickwinkel ist bei OpenGL ja immer der gleiche Vektor, nur die Welt muss invers transformiert werden, wenn ich das richtig verstanden habe.

Es hat mir auf jedenfall etwas Klarheit verschafft. :)

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

5

11.07.2011, 23:08

Die View Matrix ist im Prinzip doch das gleiche wie eine World Matrix, oder sehe ich das falsch?

Eine View-Matrix ist eine View-Matrix und eine World-Matrix ist eine World-Matrix. Die Bedeutung deiner Matritzen ist die die du ihnen gibst. OpenGL selbst hat keine Ahnung davon was eine View-Matrix ist und das ist ihm auch herzlich egal...

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 514

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

6

11.07.2011, 23:16

Joa, die Frage war wohl etwas sinnlos. Stimmt wohl. ^^ Danke. ^^

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

7

11.07.2011, 23:24

Achso, dir gings grundsätzlich darum was man unter einer Viewmatrix versteht!? In dem Fall stimmt deine Beschreibung natürlich. Im Prinzip isses so dass OpenGL dir alles rendert was im Einheitswürfel (von (-1,-1,-1) nach (1,1,1)) drin liegt. Wie du deine Vertices da reinbekommst ist deine Sache. Die drei üblichen Matritzen die man auf dem Weg in den Einheitswürfel verwendet sind die Worldmatrix (transformiert von Object- in Worldkoordinaten), die Viewmatrix (transformiert von World- in Viewkoordinaten, also in ein Koordinatensystem wo die Kamera im Ursprung liegt und entlang der z-Achse blickt) und die Projectionmatrix (transformiert von View- in Clipkoordinaten, also den Einheitswürfel).

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 514

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

8

12.07.2011, 19:27

Genau das meinte ich. Danke. :) Es ist mir lieber, die allgemeineren Begriffe zu nehmen, als die, die mir als erstes einfallen. So fällt es anderen dann auch leichter zu verstehen was ich tue, wenn ich nochmal Hilfe brauche. ^^ Oder man später mal mit jemandem zusammen arbeitet.
Das wichtigste war mir aber erstmal den üblichen Ansatz zu sehen, wie Objekte in der Welt transformiert und gerendert werden. Also, wie das ganze gemanaged wird.

Wenn ich jetzt verschiedene Shaderprogramme habe, dann sollten die Shaderprogramme nacheinander gebunden werden und die jeweiligen Objekte im passenden Bereich gerendert werden? Würde für mich so Sinn machen. Und dabei sollte es dann auch möglich sein, mehrere Effekte auf ein Objekt zu legen. Sagen wir, ich hätte ein Shaderprogramm für das Positionieren der Objekte in der Welt und eines um für bestimmte Objekte einen Effekt wie Bloom oder MotionBlur hinzuzufügen.
Wäre das im Prinzip ok:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
glUseProgram(transformProgram);
int projectionMatrixLocation = glGetUniformLocation(transformProgram.getProgramID(), "ProjectionMatrix");
int viewMatrixLocation = glGetUniformLocation(transformProgram.getProgramID(), "ViewMatrix");
glUniformMatrix4fv(projectionMatrixLocation, 1, GL_FALSE, &projectionMatrix[0][0]);
glUniformMatrix4fv(viewMatrixLocation, 1, GL_FALSE, &viewMatrix[0][0]);
player->render();
ball->render();
...
glUseProgram(blurProgram);
//uniform locations holen...
ball->render();
glUseProgram(0);


Wenn das in etwas hin kommt, dann habe ich es wohl verstanden. Das ist natürlich nur exemplarisch und kein reeller Code. ^^
Wenn das vollkommen falsch ist, dann muss ich wohl nochmal recherchieren. ;)

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

9

12.07.2011, 23:47

"Mehrere Effekte auf ein Objekt legen" ist eine sehr schwammige Sache. Wenn du mal genau drüber nachdenkst wirst du feststellen dass das total abhängig von der Art der Effekte ist wie die zusammenspielen können/müssen/sollen. Einen Bloom wird man normalerweise als Post-Processing-Effekt realisieren, sowas lässt sich nicht wirklich in einen Shader der auf jedes Objekt einzeln angewendet wird packen.

Zerbrich dir mal ein bisschen weniger den Kopf und render einfach ein paar Objekte. Dann wirst du sofort sehen wie es funktioniert und wie es nicht funktioniert ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (12.07.2011, 23:59)


MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 514

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

10

13.07.2011, 20:37

Das werde ich machen. :)
Es gibt eh noch sehr viele Baustellen auf dem Weg. Es wäre echt schön, wenn man für die Hobbyprojekte mal so viel Zeit hätte wie für die beruflichen. Wenn man sieht, was man in einer 40 Stunden Woche schafft und mit einer Handvoll daheim wird einem Schwindelig. ^^

Werbeanzeige