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

Aktuelle Zeit: Mo Jul 14, 2025 22:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 21:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hallo mal wieder!

Ich bin gerade dabei meine Vertexdaten mit ARB_Vertex_buffer_object zu rendern.
Das funktioniert ohne Texturen und ohne Vertexshader auch einwandfrei. Mit Texturen bekomme ich es aber nicht hin (er zeigt keine Texturen an :( ) und sobald ich meinen Vertexshader den ich heute geschrieben hab (und der auch einwandfrei funktioniert wenn ich das ganze mit glVertex3f(), glNormal3f(), etc mache) kommt beim Aufruf von glDrawElements(); ein Zugriffsfehler in der DLL von ATI. :(
Das ganze mache ich über diesen Weg:
Code:
  1.     glBindBufferARB(GL_ARRAY_BUFFER_ARB, FRenderMeshes[Mesh].VBO);
  2.     glVertexPointer(3, GL_FLOAT, SizeOf(TDrawVertex), Pointer(0));
  3.     glNormalPointer(GL_FLOAT, SizeOf(TDrawVertex), Pointer(24));
  4.     glVertexAttribPointerARB(1, 4, GL_FLOAT, False, SizeOf(TDrawVertex), Pointer(48));
  5.     glClientActiveTextureARB(GL_TEXTURE0_ARB);
  6.     glEnable(GL_TEXTURE_2D);
  7.     glBindTexture(GL_TEXTURE_2D, FTexturemanager.Textures[0].Texture.TextureID);
  8.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  9.     glTexCoordPointer(2, GL_FLOAT, SizeOf(TDrawVertex), Pointer(80));
  10.     glClientActiveTextureARB(GL_TEXTURE1_ARB);
  11.     glEnable(GL_TEXTURE_2D);
  12.     glBindTexture(GL_TEXTURE_2D, FTexturemanager.Textures[1].Texture.TextureID);
  13.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  14.     glTexCoordPointer(2, GL_FLOAT, SizeOf(TDrawVertex), Pointer(96));
  15.  
  16.     glEnableClientState(GL_VERTEX_ARRAY);
  17.     glEnableClientState(GL_NORMAL_ARRAY);
  18.     glEnableVertexAttribArrayARB(1);
  19.  
  20.     glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, FRenderMeshes[Mesh].EBO);
  21.  
  22.     glDrawElements(GL_TRIANGLES, FLevel.Meshes[LevelMesh].TriangleCount*3, GL_UNSIGNED_INT, Pointer(0));
  23.  
  24.     glDisableVertexAttribArrayARB(1);
  25.     glDisableClientState(GL_VERTEX_ARRAY);
  26.     glDisableClientState(GL_NORMAL_ARRAY);
  27.     glClientActiveTextureARB(GL_TEXTURE1_ARB);
  28.     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  29.     glClientActiveTextureARB(GL_TEXTURE0_ARB);
  30.     glDisableClientState(GL_TEXTURE_COORD_ARRAY);
Mein TDrawVertex sieht dabei so aus:
Code:
  1. TDrawVertex = record
  2.     Position : TVertex;
  3.     Normal   : TVector;
  4.     Tangent  : TVector;
  5.     Tex1     : Array[0..1] of Single;
  6.     Tex2     : Array[0..1] of Single;
  7.   end;
Vielleicht seht ihr ja einen groben Fehler. Mir will so keiner auffallen, aber wahrscheinlich seh ich den Wald vor lauter Bäumen nicht...

[EDIT]
Autsch, ich hab glatt bei dem Vertexattribut 4 statt 3 geschrieben, bzw. den Typ im DrawVertex ein zu klein gemacht, wie man es nimmt...
[/EDIT]

[EDIT2]
Dadurch ist der Fehler mit der Textur behoben, aber der Fehler mit dem Vertexprogram bleibt bestehen. Ich habe ihn jetzt wohl auf die Übergabe des Vertexattributs (die Tangente) eingegrenzt. Wenn ich glEnableVertexAttribArrayARB(1); ausklammere läuft der Code auch mit Vertexprogram, allerdings funktioniert dieses dann natürlich nicht entsprechend. Wie übergibt man in einem Vertex_buffer_object oder Vertex-Array ein Vertexattribut?
[/EDIT2]

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hm, weiß keiner wie man bei der Nutzung von Vertex-Arrays ein Attribut an das Vertexprogramm übergeben kann? Also das was ich sonst mit glVertexAttrib4fARB(1, Value[0], Value[1], Value[2], Value[3]); mache möchte ich jetzt irgendwie mit einem Vertex-Array bzw. VBO nutzen.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das geht mit diesen Funktionen:

Code:
  1. procedure glEnableVertexAttribArrayARB(index:gluint);stdcall;
  2. procedure glDisableVertexAttribArrayARB(index:gluint);stdcall;
  3. procedure glVertexAttribPointerARB(index:gluint;size:glint;_type:glenum;normalized:glboolean;stride:glsizei;data:pointer);stdcall;


Mir ist aufgefallen,daß der ATI Treiber nur gl_float als Format und gl_unsigned_byte bei dem Color Array akzeptiert. Bei anderen Formaten wie gl_short, die auf der GF funktionieren, wird das Program extrem langsam und das Auslesen der Werte wird wohl dann durch Software emuliert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 12:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich hab damit zwar noch nicht gearbeitet, aber nach dem Durchstöbern der Spezifikation glaube ich das dein Fehler hier liegt :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>glVertexAttribPointerARB(<span class='integer'>1</span>, <span class='integer'>4</span>, GL_FLOAT, False, SizeOf(TDrawVertex), Pointer(<span class='integer'>48</span>));</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Das sieht mir sehr suspekt aus, besonders der letzte Paramter (Pointer(48)) dürfte so auf keine Fall funktionieren!Da muss eher ein Pointer auf TDrawVertex[48] oder so hin.
Des weiteren wärs nicht schlecht, wenn du mal genauer erklären würdest welcher Teil von TDrawVertex jetzt die Vertexattribute beinhaltet.Wenn TDrawVertex an sich ein Vertexattribut ist, dann müsste Stride=0 sein und es würde dann trotzdem nicht funzen, da TDrawVertex ja viel zu groß (>4 Floats) ist.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Also:

TDrawVertex sieht momentan so aus:
Code:
  1.  &nbsp;TDrawVertex = record
  2.  &nbsp; &nbsp;Position : array[0..2] of Single;
  3.  &nbsp; &nbsp;Normal &nbsp; : array[0..2] of Single;
  4.  &nbsp; &nbsp;Tangent &nbsp;: array[0..3] of Single;
  5.  &nbsp; &nbsp;Tex1 &nbsp; &nbsp; : Array[0..1] of Single;
  6.  &nbsp; &nbsp;Tex2 &nbsp; &nbsp; : Array[0..1] of Single;
  7.  &nbsp;end;
Dabei ist Tangent der Teil, den ich als Attribut übergebn möchte.
Die Übergabe an sich dürfte korrekt sein, da als letzter Parameter bei VBOs ein Offset und nicht der Pointer auf das Array erwartet wird. Und die 48 sind halt 6*SizeOf(Single). Strife gibt, soweit ich das verstanden hab, hier den Abstand von einem bis zum nächsten Wert an, und das ist eben SizeOf(TDrawVertex), da sich immer nach diesem Wert alles wiederholt.

Außderm scheint es sich jetzt gelöst zu haben. Ich hatte zuerst
Code:
  1. glVertexAttribPointerARB(1, 4, GL_FLOAT, False, SizeOf(TDrawVertex), Pointer(48));
aufgerufen und dann das entsprechende Enable, es muss aber umgekehrt geschehen, sonst kommt besagte Zugriffsverletzung, zumindest bei ATI-Karten.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 13:18 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
sizeof(single)=4 Vielleicht ist das der Fehler.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Oh, danke, damals wohl irgendwie verrutscht in der Delpühi-Hilfe und dann immer mit 8 gerechnet. Jetzt scheint soweit wirklich alles zu gehen, jedenfalls was das VBO, etc angeht.
Danke euch beiden!

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Ich mag ja gar nicht mehr fragen, aber irgendwie verzweifel ich gerade mit dem Multitexturing. :(
Ich kann dem ersten Stage wunderbar eine Textur zuweisen, aber alles was ich mit dem zweiten, oder einem anderen, Stage mache ignoriert er irgendwie. Ich kann dem zweiten Stage eine Textur zuweisen, aber er rendert sie nicht. Ich habe zuvor mit
Code:
  1. glClientActiveTextureARB(GL_TEXTURE1_ARB);
  2. glActiveTextureARB(GL_TEXTURE1_ARB);
  3. glEnable(GL_TEXTURE_2D);
den Texturestage ausgewählt, Textur mit Bind zugewiesen, Environementparamater eingestellt (oder testweise auch nicht), und er zeigt die 2. Textur einfach nicht an. Geladen ist sie aber definitiv, denn ich kann sie dem ersten Stage einwandfrei zuweisen.
Ich habe auch schon zigmal mit der Reihenfolge der Befehle rumgespielt, Befehle ausgeklammert und google zu glClientActiveTextureARB befragt, aber ich bekomme einfach keine Veränderung beim 2. Stage hin.
Ein Testweise glDisable(GL_TEXTURE_2D); ergibt das gleiche Resultat wie vorher, also auch mit aktiver Texture tut OpenGL so, als sei Texturing ausgeschaltet. :huh:

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du hast ja oben gesagt, das du in deinem Programm auch ein Vertexprogramm nutzt.Wenn dem so ist, musst du die Texturkoordianten für jede von dir verwendete Texturstage in deinem VP am Ende auch nach aussen ausgeben :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>[...]
MOV result.texcoord, vertex.texcoord; // Texturkoordinaten von TMU <span class='integer'>0</span> ausgeben
MOV result.texcoord[<span class='integer'>1</span>], vertex.texcoord[<span class='integer'>1</span>]; // Texturkoordinaten von TMU <span class='integer'>1</span> ausgeben</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Deiner Problembeschreibung nach, steht in deinem VP wohl nur die erste Zeile, die die Texturkoordinaten der TMU0 nach aussen ausgibt, aber die Texturkoordinaten für die TMU1 gibts du wohl nicht aus, weshalb da auch keine Texturen angezeigt werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 17:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Nein, daran liegt es nicht.
a) habe ich diesen Code in meinem Shader:
Code:
  1.  
  2.  &nbsp;ShaderCode.Add('MOV result.texcoord[0], vertex.texcoord[0];');
  3.  &nbsp;ShaderCode.Add('MOV result.texcoord[1], vertex.texcoord[1];');

B) funktionierte der Shader samt den Texturen und den Texturenvironmentparametern ja ohne Vertex-Buffer perfekt.

Trotzdem danke!

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 17:43 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Versuch mal aus dem Texcoord Array ein Attrib Array zu machen und die Koordinaten als Vertex Attribut zu übergeben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2003 17:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Autsch *mit_der_Hand_gegen_Kopf_schlag*

Auf Grund von SoS Post bin ich jeden Punkt an dem auf die Texturkoordinaten zugegriffen wird einmal durchgegangen. Dabei gab es einen Punkt, an dem die für den zweiten Stage falsch angegeben worden (obwohl die eigentlich nur vom 1. übernommen werden sollten). Dadurch waren die Texturkoordinaten so falsch, dass man die Textur nirgends sehen konnte. :angry: Das ganze steckte auch noch im Editor, daher hat's etwas gedauert das zu finden.

Tut mir leid für die Mühe, und nochmals danke!

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]