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

Aktuelle Zeit: Fr Jul 18, 2025 12:39

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Multitexturing und VBOs?
BeitragVerfasst: Mo Okt 13, 2008 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi ihr,

Gibt es eine möglichkeit, in ein VBO mehrere Texturkoordinaten zu speichern? glTexCoordPointer nimmt ja keinen Parameter, der irgendwie die betreffende Texturunit bestimmen würde und eine Funktion wie glMultiTexCoordPointer habe ich vergeblich gesucht...

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Kannst du nicht einfach 2 mal eine Id anfordern und dann 2 Arrays in 2 verschiedene Buffer packen und dann Textur1 binden, Buffer1 binden, Textur 2 binden, Buffer 2 binden oder überschreibt er dann die Koordinaten?

GL.ClientActiveTexture(GL_TEXTURE0_ARB);
GL.EnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(Binde Buffer A);

GL.ClientActiveTexture(GL_TEXTURE1_ARB);
GL.EnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(Binde Buffer B);

steht jedenfalls bei Gamedev.net so im Forum ^^

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:10 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Das selbe wollte ich auch gerade Fragen...

So eine Lösung hab ich auch schon gefunden, allerdings funktioniert die bei mir zumindest nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Vorher müssen natürlich die Texturen auch gebunden werden aber das ist ja klar.
Eventuell die Texturkoordinaten in einen InterleavedBuffer packen und dann den Offset übergeben, vielleicht komtm Opengl damit besser klar, als 2 einzelne Buffer mh.
Aber ich hab bisher keine andere Lösung gesehen für das Problem . Eigentlich ähnlich wie im Immediate Modus. :S
Gibts den Fehler oder werden die Texturen nur mit einem Texturkoordarray gerendert? ^^

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:27 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also mein Code sieht so aus:

Code:
  1.  
  2. glBindBufferARB(GL_ARRAY_BUFFER, VBO_Vertices);
  3. glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, VBO_Triangles);
  4. glEnableClientState(GL_INDEX_ARRAY);
  5.    
  6. glClientActiveTextureARB(GL_TEXTURE0);
  7. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  8. glTexCoordPointer(2,GL_FLOAT, SizeOf(TVBO_T2F_V3F_Vertex),Pointer(0));
  9. glVertexPointer(3,GL_FLOAT, SizeOf(TVBO_T2F_V3F_Vertex), Pointer(8));
  10. glEnableClientState(GL_VERTEX_ARRAY);
  11.  
  12. glDrawElements(GL_TRIANGLES, Anzahl, GL_UNSIGNED_INT, nil);
  13.  


Die Vertices werden gerendert, allerdings ist alles Schwarz.
Mit "glInterleavedArrays(GL_T2F_V3F, SizeOf(TVBO_T2F_V3F_Vertex), nil);" statt dem mittleren Teil funktioniert alles. Bis auf Multitexturing natürlich, aber ich hätte gerne wenigstens eine Textur, weshalb ich auch oben nur die Koordinaten für eine gesetzt habe (mit 2 funktioniert es genausowenig).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Mh eventuell dafür ein eigenes Thema eröffnen, damit dieses hier nicht thematisch auf die schiefe Bahn gerät? *mod's anguck*^^

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texid);

Aber die Textur hast du vorher auch so gebunden und auch erst nach dem "activeTextur" dann das "Enable" gemacht? Weil ansonsten sind die Texturen nicht an, wenn das vorher "Enabled" wurde, dass muss für jede Textur dann einzeln gemacht werden.

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:43 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ja, sonst würde es ja mit glInterleavedArrays auch nicht gehen, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 13, 2008 23:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Im Klartext: Es geht nur über Vertexattribute und Shader, sehe ich das richtig? Naja, gut, erstmal auch nicht schlimm, wenngleich ärgerlich...

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 00:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Schläfer hat geschrieben:
Ja, sonst würde es ja mit glInterleavedArrays auch nicht gehen, oder?

Ach so ich dachte es wird generel keine Textur angezeigt. Am besten äußert sich jemand dazu, der InterleaveArrays schon benutzt hat =O

@Lord Horazont Naja nicht unbedingt, bei mir gehts auch ohne eigenen Shader o.o
Aber OpenGl 3.0 hat doch da was passendes, mit diesen Texturarrays, aber das komtm wohl nicht in frage ;)

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 00:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
ah, jetzt habe ich deinen Code von oben geblickt. Ja gut, das müsste man ausprobieren, dazu habe ich aber jetzt nicht mehr die Muße. Mal schauen, was ich da nachher hinbekomme.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 00:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 16, 2008 20:26
Beiträge: 158
Wohnort: Berlin
Programmiersprache: c++,c#,java,ruby,php
Lord Horazont hat geschrieben:
ah, jetzt habe ich deinen Code von oben geblickt. Ja gut, das müsste man ausprobieren, dazu habe ich aber jetzt nicht mehr die Muße. Mal schauen, was ich da nachher hinbekomme.

Gruß Lord Horazont

Ja ist halt JavaCode der angepasst wurde da fehlen die entsprechenden Referenzen und Pointer ^^
Aber zu dieser Uhrzeit darf einem auch einiges schwerer fallen. Auf jedenfall viel Spaß dabei und gute Nacht ^^

_________________
System: Phenom XII X4 955 3,21Ghz , GTX 560 TI, 4GB-Ram, Windows 7 64x


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 02:40 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Endlich konnte ich doch noch einen kleinen Fortschritt erreichen.

Mit diesem Code konnte ich immerhin das Zeichnen was ich wollte:

Code:
  1.  
  2.     glBindBufferARB(GL_ARRAY_BUFFER, VBO_Vertices);
  3.     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, VBO_Triangles);
  4.  
  5.     glInterleavedArrays(GL_V3F, SizeOf(TVBO_T2F_V3F_Vertex), Pointer(8));
  6.    
  7.     glClientActiveTexture(GL_TEXTURE0);
  8.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  9.     glTexCoordPointer(2,GL_FLOAT,sizeof(TVBO_T2F_V3F_Vertex),nil);
  10.  
  11.     glClientActiveTexture(GL_TEXTURE1);
  12.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  13.     glTexCoordPointer(2,GL_FLOAT,sizeof(TVBO_T2F_V3F_Vertex),nil);
  14.  
  15.     glDrawElements(GL_TRIANGLES, Anzahl, GL_UNSIGNED_INT, nil);
  16.     glClientActiveTexture(GL_TEXTURE1);
  17.     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  18.     glClientActiveTexture(GL_TEXTURE0);
  19.     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  20.     glDisableClientState(GL_VERTEX_ARRAY);
  21.  


So werden beide Texturen gezeichnet wie sie sollen. Am Ende nicht vergessen glClientActiveTexture wieder auf die Nummer 0 zu setzen, sonst sind die Texturen von den anderen VBOs verzerrt.

Auch wenn es jetzt macht was es soll, weiß ich nicht warum es das macht.
Die Frage ist also was macht glInterleavedArrays?
So wie es da oben steht, dachte ich es würde nur "glEnableClientState(GL_VERTEX_ARRAY)" und den "glVertexPointer" einstellen. Aber dem ist wohl nicht so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 09:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Genau. So wie Schläfer es zu letzt gepostet hast muss es auch gemacht werden. Um Multitexturing mit VBOs benutzen zu können muss man bei der Textureinheit lediglich ein TexCoordArray einstellen und aktivieren. Dazu sind keine Shader oder sonst was notwendig. Wenn doch, dann wäre diese Technologie ja mal ein ganz klein wenig unbrauchbar. ;)

Code:
  1. glInterleavedArrays(GL_V3F, SizeOf(TVBO_T2F_V3F_Vertex), Pointer(8));

Der Code sollte in etwa ziemlich genau das Gleiche machen wie nachfolgener. glInterleavedArrays kennt verschiedene Schemen die man aktivieren kann. Das ist nur dazu gedacht um ein bisschen Arbeit zu ersparen. V3F besagt zum Beispiel Vertex mit 3 Werten vom Typ Float. Stride ist dabei alle wie viele Bytes sich ein solcher Wert befindet und Offset ist die Anfangsposition.
Code:
  1. glVertexPointer(3, GL_FLOAT, SizeOf(TVBO_T2F_V3F_Vertex), Pointer(8));
  2. glEnableClientState(GL_VERTEX_ARRAY);

[edit] In dem ersten Versuch meiner VBO Unit mache ich im übrigen auch nichts anderes als das da und dort funktionieren VBOs vollkommen korrekt. [/edit]


TextureArrays: Das ist wieder was ganz anderes. ;) Ein TexturArray ist eine Art 3D Textur. Nur, dass es nicht wirklich 3D ist sondern eher ein Array. Also ein "Array" mit 5 Texturen die alle die gleiche Größe und Format haben. Diese Texturen liegen alle am Stück im Speicher und werden nach außen als 1 Textur gesehen. Die kann man aber auch nur wirklich sinnvoll mit Shadern benutzen. Im Shader kann man sich dann die Werte der Textur[0] und der Textur[3] geben lassen und dort dann überblenden. Für Landschaften zum Beispiel. Denn dann könnte man 16 Landschaftstexturen benutzen und hätte trotz dessen noch 15 Textureinheiten frei. Wenn ich das noch richtig in Erinnerung habe und auch so richtig verstanden habe. Das ist aber ein DX10 Feature und wird aktuelle auch nur von GF8+ unterstützt.

http://developer.nvidia.com/object/all_documents.html
Dort gibt es ein "Texture Array Terrain" Dokument.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 10:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also ist der ClientState GL_TEXTURE_COORD_ARRAY genauso abhängig von der Texturunit wie GL_TEXTURE_2D. Okay, klar soweit. Also einfach den glTexCoordPointer während die entsprechende Texturunit aktiviert ist aufrufen.

Danke für die späten Antworten zu diesem doch verhältnissmäßig komplexen Thema :)

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 14, 2008 11:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Lord Horazont hat geschrieben:
Danke für die späten Antworten zu diesem doch verhältnissmäßig komplexen Thema :)

Gibt Leute die müssen kurz nach 6:00 aufstehen. Da treibe ich mich doch nicht mehr 0 Uhr im Forum rum. :P Aber ja. Die VBOs haben leider so die ein oder andere Altlast die sie nicht unbedingt leichter machen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.009s | 16 Queries | GZIP : On ]