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

13.07.2009, 22:42

OpenGL GLSL+VertexBuffer

Hi,
mir wird das ganze langsam zu viel hier. Also ich möchte komplett mit GLSL rendern und alle VertexAttribute mit Attributvariablen dem Shader übergeben, also auf glVertex und glNormal und sowas verzichten, damit es schön einheitlich ist.
Jetzt finde ich allerdings keinen schönen Quellcode, wo das mal zusammenhängend erklärt wird. Alles was ich finde sind zich OpelGL Funktionen mit total unlogischen Namen, und überall mal kleine Codefetzen. Fast überall wird nur mal ein VertexArray statt einem Vertexbuffer benutzt oder gar erstmal die Syntax für glBegin/glEnd Blöcke erklärt.

ich bin mittlerweile ziemlich genervt und habe ehrlich gesagt auch keine Lust mit zusammengestückelten Informationen irgendwas zusammen zu frimmeln um das dann anschließend Studenlang zu debuggen.

Kurz und gut: Ich bräuchte ein Tutorial oder ein Beispiel, dass das ganze mal etwas zusammenhängender beschreibt.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

14.07.2009, 08:53

Zitat von »"Jonathan_Klein"«


Hi,
mir wird das ganze langsam zu viel hier. Also ich möchte komplett mit GLSL rendern und alle VertexAttribute mit Attributvariablen dem Shader übergeben, also auf glVertex und glNormal und sowas verzichten, damit es schön einheitlich ist.


Es wäre eher konsequent die build-in Attribute zu verwenden und erweiterte (unübliche) Attribute per VertexAttribX zu übermitteln. GLSL bietet diese Funktionalität ja nicht umsonst.

Zitat von »"Jonathan_Klein"«


Jetzt finde ich allerdings keinen schönen Quellcode, wo das mal zusammenhängend erklärt wird. Alles was ich finde sind zich OpelGL Funktionen mit total unlogischen Namen, und überall mal kleine Codefetzen. Fast überall wird nur mal ein VertexArray statt einem Vertexbuffer benutzt oder gar erstmal die Syntax für glBegin/glEnd Blöcke erklärt.


Was erwartest du denn von einen schönen Quellcode? Die verfügbaren Quellcodes sollten ausreichend sein für Beispielzwecke. Außerdem versteh ich nicht was du an der Namensgebung von GL auszusetzen hast, welche Namen findest du den unlogisch? Ich konnt' das bislang nicht feststellen...
Genauso wenig versteh ich deinen anderen Kritikpunkt, CVAs und VBOs sind von der Anwendung in GL austauschbar. Oder hast du bereits Probleme beim erzeugen von Vertexbuffer Objekten? Dann wäre ggf die VBO Spezifikation angebracht.

Zitat von »"Jonathan_Klein"«


ich bin mittlerweile ziemlich genervt und habe ehrlich gesagt auch keine Lust mit zusammengestückelten Informationen irgendwas zusammen zu frimmeln um das dann anschließend Studenlang zu debuggen.


Das ist halt das Tagewerk eines Programmierers... Damit muss man sich abfinden, nicht immer bekommt man alles Mundgerecht präsentiert.

Zitat von »"Jonathan_Klein"«


Kurz und gut: Ich bräuchte ein Tutorial oder ein Beispiel, dass das ganze mal etwas zusammenhängender beschreibt.


Welches Ganze willst du überhaupt zusammenhängender erklärt bekommen? GLSL? Dann leg ich dir die entsprechende Spezifikation nah, da steht alles drin:
ARB_vertex_shader
ARB_fragment_shader

3

14.07.2009, 18:00

Also ich weiß grad einfach nicht, wie ich einen Vertexbuffer erzeuge in dem ich Attributvariablen habe.
Ich meine, wenn ich einen normalen Vertexbuffer erstelle, kann ich ja mit

Quellcode

1
glInterleavedArrays(GL_T2F_N3F_V3F, m_VertexSize, NULL);

Angeben, welche Daten er wo findet.

Ich denke im Moment, dass ich die Buffer einfach ganz normal erstelle und mit floats fülle, beim erstellen muss er ja noch nicht unbedingt wissen, was drin stehen wird.
Nur beim rendern müsste ich halt sagen können "das Attribut xyz steht in diesem Buffer, das Attribut zyx in jenem" und so weiter.
Womit mach ich das?
Lieber dumm fragen, als dumm bleiben!

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

4

14.07.2009, 18:37

Du kannst den VBO füllen so wie du es möchtest - wenn er gefüllt ist und mit glBindBufferARB aktiviert wurde kannst du OpenGL sagen welche Daten wo stehen mit:

glNormalPointer
glVertexPointer
glTexCoordPointer
...

Bei den Methoden übergibst du dann nicht den Pointer auf einen Speicherbereich als letzten Parameter, sondern den Offset zum Beginn deiner Struktur.

Wenn deine Daten so aufgebaut sind: 3xfloat = Vertex, 3xfloat = Normal, 2xfloat = u/v coords (in dieser Reihenfolge und pro Punkt), dann sendest du

glVertexPointer(3, GL_FLOAT, 32, 0)
glNormalPointer(GL_FLOAT, 32, 12)
glTexCoordPointer(2, GL_FLOAT, 32, 24)

an OpenGL.

Denk aber daran mit glEnableClientState die Arrays die du benutzt auch zu aktiveren.

Hier ist ein kleines VBO-Tutorial für Java mit JOGL.

Wenn du eigene Attribute hinzufügen möchtest, dann nutzt du zusätzlich noch

glVertexAttribPointer

Hierbei muss die Attribut-Id zuvor mit glBindAttribLocation an eine attribute-Variable im GLSL-Shader gebunden werden. Das geht allerdings erst wenn der Shader gelinkt worden ist mit glLinkProgram.
Aber aufpassen: Es gibt einige Ids die Nvidia reserviert hat (manche kann man "missbrauchen" - andere nicht... ist glaub ich ausprobieren angesagt). Schau mal dazu hier nach: http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php ganz unten auf der Seite.

Grüße
Stefan

5

14.07.2009, 22:17

d.h. kann man immer nur einen Vertex und einen indexbuffer benutzen?
Oder kann man auch meinetwegen die Positinoen in einem und die Texturkoordinaten in einem anderen Buffer haben?

Und woher weiß Ogl, ob das jetzt ein Adresse oder ein Offset ist? Liegt das nur daran, ob ein Vertexbuffer gebunden ist, oder nicht? Und die Gleiche Technik wird auch beim zeichnen benutzt, den der Aufruf sieht ja quasi genauso aus, wie der zum Array Zeichnen.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

15.07.2009, 11:48

Nein, zusammengehörige Vertexdaten liegen in einem Puffer, allerdings können diese "Interleaved" oder "Blockweise" abgelegt werden, das ist egal.

Werbeanzeige