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

Aktuelle Zeit: Sa Jul 19, 2025 10:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Fr Dez 11, 2009 00:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
was könnte das sein?

Einfach mal testweise nach jeder GL-Operation die OpenGL Fehler abfragen. Bzw. um die Stelle erstmal grob einzugrenzen vielleicht in jeder Methode oder alle X Zeilen oder so.

Zitat:
Was ich jetzt zwar schon ganz ansehnlich hinbekomme aber immernoch nicht so, dass ich wirklich sagen würde: Geil, so kanns bleiben...

Also es empfiehlt sich sicherlich der Umstieg auf VertexBufferObjects. Diese funktionieren quasi genauso wie die VertexArrays, mit dem Unterschied das die Daten auf der Grafikkarte liegen und nicht in jedem Frame durch den PCIe-Port (bzw. AGP) geschoben werden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Fr Dez 11, 2009 04:04 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Wölfchen hat geschrieben:
hmm, hatte ich erwähnt das ich sowohl delphi, als auch OpenGL Anfänger bin, ohne großartig andere Programmierkenntnisse? :) aber ich werde gegebenenfalls nochmal darauf zurückkommen :roll: :mrgreen:

Ja hast du. Und auch, dass dich die 3-fachen Normalen stören. Da fühlte ich mich einfach danach eine Möglichkeit aufzuzeigen, wie man das (irgendwann mal) umgehen könnte. Hast dich aber Gott sei Dank auch nicht abschrecken lassen.
Wölfchen hat geschrieben:
Sind einfach CAD Daten, alles Mögliche... ich weiss ja noch nicht, was alles damit machbar ist... dieweil ich ja schon froh bin wenn ich sie geladen und dargestellt bekommen :roll:

Ok, da habe ich keine Ahnung wie das Dateiformat aussieht. Wenn da für jeden Punkt von jeder Fläche Normalen drin stünden wäre es ebenso leicht alles mit smooth shading anzuzeigen so wie hier:
Bild
Aber wenn du nur eine Normale pro Fläche/Dreieck hast wie es scheint bist du auf dem richtigen Weg!
Wölfchen hat geschrieben:
So jetzt noch eine Frage:

Mein Errorhandler gibt mir den Fehler "invalid Operation" zurück, aber mein prgramm funzt und die Modelle sehen auch normal aus... Ich habe versucht alles mögliche auszukommentieren, was mit GL zu tun hat aber die Fehlermeldung bleibt beharrlich...

was könnte das sein?

Den Fehler generiert glGetError() von sich aus, wenn es zwischen glBegin() und glEnd() aufgerufen wird. Wäre ein typischer Anfängerfehler.
Code:
  1. glBegin(...);
  2.     err := glGetError(); // darf hier nicht aufgerufen werden, liefert GL_NO_ERROR zurück und setzt GL_INVALID_OPERATION
  3. glEnd();
  4. err := glGetError(); // kann wieder aufgerufen werden und gibt GL_INVALID_OPERATION zurück

An sonsten an Coolcat halten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Fr Dez 11, 2009 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
nun zum Thema Face normalen:

1. Du hast ein Array das Vertex Daten speichert, die Vertexdaten sind jeweils ein record aus 3GLFloat/Single
2. Du hast ein IndexArray das die Indiezes der Vertieces eines Faces beinhaltet.

Das Index Array kannst du also auch als ein record darstellen. Das könntest du dann zum Beispiel "TFace" nennen. Es beinhaltet 3 (bzw. wenn du quads renderst 4) unsigned Integer, die beschreiben, aus welchen Vertieces das Face besteht, UND 3GLFloat/Single für die Face Normale. In dem vorgeschlagenen Wikieintrag ist ja bereits beschrieben, wie man in einem Record verschiedene Arraytypen ablegen kann. Dadurch, dass die Indizes pro Face sind kannst du so auch die Normale pro Face einbinden.

Wenn ich da nicht irgendeinen Knick in der Gehirnrinde habe, sollte das so gehen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mo Dez 14, 2009 22:32 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo,

ich bins mal wieder...

nachdem ich fast das gesamte wochenende gebraucht habe einen weg zu finden meine daten so zu verwursteln, dass ich jetzt ein Array of TVertex habe und ein Array of GLuint wollte ich das jetzt endlich mal rendern, und um es nicht zu kompliziert zu machen erstmal ohne die normalen...

leider bekomme ich immer eine access violation meldung wenn ich versuche zu rendern...

also mein Array of Tvertex heisst Varray.
Mein Array of GLUint mit den positionen heisst optvarrayindfirst.

aber meine versuche

Code:
  1.  
  2.       glEnableClientState(GL_VERTEX_ARRAY);
  3.       glVertexPointer(3, GL_FLOAT, 0, @Varray[0]);
  4.       glDrawElements(GL_triangles, sl.count, GL_UNSIGNED_INT, @optvarrayindfirst);

führen nur zu

Zitat:
Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 691E9F33 in Modul 'atioglxx.dll'. Lesen von Adresse 00000004'. Prozess Rendertests.exe (2068)


was mache ich falsch?
über einsteigerfreundliche Antworten freue ich mich wie immer sehr!

*** EDIT ***
ok ich habe den fehler wohl gefunden... ich dachte an die stelle von sl.count muß die gesamtlänge von optvarrayindfirst, wenn ich da eine 0 hinschreibe dann kommt die access violation nicht mehr...

aber....

es wird auch nichts gerendert :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 15, 2009 07:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
du hast einen entscheidenden Fehler gemacht und zwar muss der dritte Parameter von glVertexPointer die Größe deines TVertex in byte angeben, da machst du am besten mit SizeOf(TVertex). Bei dir steht da jetzt (in deinem geposteten Code) eine 0, das heißt, dass OpenGL annimmt, dass deine zu zeichnenden Daten eine größe von Null haben, dementsprechen wird OpenGl an der Stelle keine Daten vermuten und du kannst dann auch keine Daten zeichnen.

Das sollte es eigentlich schon gewesen sein.

Edit: zu deinem Edit, das dort die Gesamtlänge hinkommt ist schon richtig, dass es bei dir mit der Null klappt, ist deshalb logisch, weil du mit einer Null als Länge OpenGl aufforderst nichts zu zeichnen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 15, 2009 08:12 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Sellmann hat geschrieben:
du hast einen entscheidenden Fehler gemacht und zwar muss der dritte Parameter von glVertexPointer die Größe deines TVertex in byte angeben, da machst du am besten mit SizeOf(TVertex). Bei dir steht da jetzt (in deinem geposteten Code) eine 0, das heißt, dass OpenGL annimmt, dass deine zu zeichnenden Daten eine größe von Null haben, dementsprechen wird OpenGl an der Stelle keine Daten vermuten und du kannst dann auch keine Daten zeichnen.

Das sollte es eigentlich schon gewesen sein.

Edit: zu deinem Edit, das dort die Gesamtlänge hinkommt ist schon richtig, dass es bei dir mit der Null klappt, ist deshalb logisch, weil du mit einer Null als Länge OpenGl aufforderst nichts zu zeichnen.


Das ist wohl nicht der einzige Fehler, denn ich schaffe es einfach nicht, mit glDrawElements irgendwas zu rendern... ich will ja jetzt hier nicht 5 seiten code reinkopieren...
so sieht der teil meines renderaufrufs aus:

Code:
  1.      
  2.       glEnableClientState(GL_VERTEX_ARRAY);
  3.       glVertexPointer(3, GL_FLOAT, sizeof(tvertex), @varray[0]); // wie gesagt, varray is mein Array of TVertex mit daten im format: (0.0 1.0 0.0, 1.0 0.0 1.0, 0.0 0.0 0.0, usw usw usw)
  4.       glcolor3f(1,0,0);
  5.       glDrawElements(GL_triangles,GL_FLOAT, 0, @optvarrayindfirst); // ganz gleich was ich hier an die dritte stelle schreibe ausser einer 0, bekomme ich eine access violation.  optvarrayindfirst ist mein array of gluint wo dann steht (5 3 1 2 3 1 2 3 4 5 1 2 3 4 usw usw usw)
  6.       SwapBuffers(DC);


ich habe auch das von lenk gepostete delphi beispiel für gldrawelements in mein template gebastelt bekomme aber auch damit nichts gerendert... wenn du willst kann ich dir das per pn schicken... für hier rein ist das doch auch zu lang


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 15, 2009 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
hast du auch geprüft, ob die Indizes in deinem IndexArray im Bereich der verfügbaren Vertices liegen, also 0 bis VertexAnzahl-1? Ich komm da deshalb drauf, weil in deiner Index Kette keine Null auftaucht. Das ist ein häufiger Fehler, dass man als Index für das erste Element eine 1 annimmt, obwohl das erste Element immer ab 0 gezählt wird. Das würde heißen, dass alle Indizes um 1 zu hoch sind und somit der höchste Index ein Vertex referenzieren würde, dass nicht mehr innerhalb des Bereiches des VertexArrays liegt.

Wenn dein Code sauber formatiert ist, macht es glaub ich auch nichts, wenn du die nennenswerten Funktionen postest und beschreibst, was du dir darunter vorstellst.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 15, 2009 09:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wölfchen hat geschrieben:
Code:
  1.  
  2.       glDrawElements(GL_triangles, sl.count, GL_UNSIGNED_INT, @optvarrayindfirst);


Ist optvarrayindfirst ein dynamisches Array? Also setzt du die Länge mit SetLength? Wenn ja, dann MUSST du ein Element übergeben und nicht das Array selbst. Der Grund. Dynamische Arrays sind eigentlich nur Pointer. Wenn du jetzt @DynArray machst, dann liefert @ die Adresse der Variable DynArray zurück. Du willst aber die Adresse der Daten haben. Also @DynArray[0]. Ansonsten würde die Funktion als Adresse irgendeinen Wert auf deinem Stack bekommen. Selbst wenn OpenGL davon genügend Werte lesen kann stünde dort nur Müll drin.

Bei Statischen Arrays (Arrays mit im Code festgelegter Größe) (StatArray: Array[0..9] of blah) wäre das zwar nicht nötig allerdings habe ich mir angewöhnt wirklich konsequent immer ein Element anzugeben. Seit dem habe ich nie wieder ein Problem dieser Art gehabt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 15, 2009 10:44 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Lossy eX hat geschrieben:
Wölfchen hat geschrieben:
Code:
  1.  
  2.       glDrawElements(GL_triangles, sl.count, GL_UNSIGNED_INT, @optvarrayindfirst);


Ist optvarrayindfirst ein dynamisches Array? Also setzt du die Länge mit SetLength? Wenn ja, dann MUSST du ein Element übergeben und nicht das Array selbst. Der Grund. Dynamische Arrays sind eigentlich nur Pointer. Wenn du jetzt @DynArray machst, dann liefert @ die Adresse der Variable DynArray zurück. Du willst aber die Adresse der Daten haben. Also @DynArray[0]. Ansonsten würde die Funktion als Adresse irgendeinen Wert auf deinem Stack bekommen. Selbst wenn OpenGL davon genügend Werte lesen kann stünde dort nur Müll drin.


Danke für die Erklärung... leider war es das aber auch nicht...
optvarrayindfirst ist ein dynamisches array dessen länge ich mit setlength(optvarrayindfirst,sl.count) festlege.


Sellmann hat geschrieben:
hast du auch geprüft, ob die Indizes in deinem IndexArray im Bereich der verfügbaren Vertices liegen, also 0 bis VertexAnzahl-1? Ich komm da deshalb drauf, weil in deiner Index Kette keine Null auftaucht. Das ist ein häufiger Fehler, dass man als Index für das erste Element eine 1 annimmt, obwohl das erste Element immer ab 0 gezählt wird. Das würde heißen, dass alle Indizes um 1 zu hoch sind und somit der höchste Index ein Vertex referenzieren würde, dass nicht mehr innerhalb des Bereiches des VertexArrays liegt.

eigentlich schon...

wenn ich einen würfel rendern will sind 8 elemente in varray und in optvarray stehen 36 zahlen von 0-7 um 12 dreiecksflächen (2 pro würfelseite) aus den 8 ecken zusammenzubasteln.

ich versuchs mal händisch hinzukriegen...
also varray sieht so aus:

Code:
  1.  
  2. 0.0 0.0 0.0 //(0)
  3. 0.0 0.0 1.0 //(1)
  4. 0.0 1.0 0.0 //(2)
  5. 0.0 1.0 1.0 //(3)
  6. 1.0 0.0 0.0 //(4)
  7. 1.0 0.0 1.0 //(5)
  8. 1.0 1.0 0.0 //(6)
  9. 1.0 1.0 1.0 //(7)
  10.  

und in optvarrayindfirst steht dann

Code:
  1. 1,5,3,3,7,5 // für die hintere fläche usw usw usw (ich bekomm das jetzt von hand nicht ganz zusammen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 16, 2009 00:39 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ok mehr durch probieren und mehrmaliges haareraufen habe ich jetzt eine version gefunden die funktioniert:

Code:
  1.  
  2.       glEnableClientState(GL_VERTEX_ARRAY);
  3.       glVertexPointer(3, GL_FLOAT,0,@varray[0]);
  4.  
  5.       glDrawElements(GL_triangles,sl.count, GL_UNSIGNED_INT, @optvarrayindfirst[0]);


und das obwohl da eine 0 steht an der dritten stelle vom vertexpointer.... (??)
egal, es geht und ich versuch morgen zu verstehn wieso...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 16, 2009 11:24 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Die 0 ist da richtig. Sie sagt aus, dass alle Daten im Speicher direkt hintereinander liegen. Da muss man nur einen Wert eintragen, wenn man es anders haben will.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 16, 2009 12:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
oh dann hab ich mich geirrt, dachte, dass wäre die Größe eines Vertex... :oops:

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 16, 2009 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Es handelt sich,wie auch dem Wiki zu entnehmen an dieser Stelle nicht um die größe,sondern um den Abstand zwischen den einzelnen Datenblöcken die als Vertex zu interpretieren sind, dasss ist zum beispiel notwendig wenn mann die Daten von Farben, Normalen und wer weiß was noch nur zusammen im Speicher vorliegen hat und diese keine der vorhandenen Interleaved "Muster" entsprechen, oder man einfach mal die Farbe weglassen möchte aber nicht die ganzen Daten deswegen umstrukturien will...

mfg FrenK


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Do Dez 17, 2009 19:30 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Wölfchen hat geschrieben:
ok mehr durch probieren und mehrmaliges haareraufen habe ich jetzt eine version gefunden die funktioniert:

Code:
  1.  
  2.       glEnableClientState(GL_VERTEX_ARRAY);
  3.       glVertexPointer(3, GL_FLOAT,0,@varray[0]);
  4.  
  5.       glDrawElements(GL_triangles,sl.count, GL_UNSIGNED_INT, @optvarrayindfirst[0]);



jaja, zu früh gefreut.... denn jetzt wollte ich die Normalen einbinden, welche ich mir ebenfalls in ein array geschoben habe... aber offenbar erwartet gldrawelements andere normalen als wenn ich das mit glbegin(gl_triangles) mache...

also um mein neues problem zu schildern:

in meinen ursprungsdaten liegen die normalen pro dreiecksfläche vor. ich habe jetzt folgendes versucht:

Code:
  1.  
  2.       glEnableClientState(GL_NORMAL_ARRAY);
  3.       glNormalPointer(GL_FLOAT,0,@N2array[0]);
  4.       glEnableClientState(GL_VERTEX_ARRAY);
  5.       glVertexPointer(3, GL_FLOAT,0,@varray[0]);
  6.  
  7.       glDrawelements(GL_triangles,sl.count, GL_UNSIGNED_INT, @optvarrayindfirst[0]);
  8.  


N2array ist dabei mein array mit den normalen... ich haber auch ein indexarray für die normalen aber keine ahnung wie ich es verwenden kann... auch verstehe ich nicht in welche form meine normalendaten vorzuliegen haben, ich habe sie zur zeit als tvertex mit (glfloat glfloat glfloat) bereitliegen, aber ich kann in der zeile glNormalPointer(GL_FLOAT,0,@n2array[0]) vorne nicht angeben das da 3 floats pro array eintrag warten...

um ganz sicher zu gehen, dass meine normalen nach dem hin und herschubbsen noch stimmen habe ich die teile testweise mit folgendem code gerendert:

Code:
  1.  
  2. glBegin(gl_triangles);
  3.  FOR i := 0 TO sln.count*3 - 1 DO BEGIN
  4. glnormal3f(n2array[0+i].Vert1x,
  5.               n2array[0+i].Vert1Y,
  6.               n2array[0+i].vert1z);        
  7. glvertex3f(varray[optvarrayindfirst[0+i]].vert1x,
  8.               varray[optvarrayindfirst[0+i]].Vert1Y,
  9.               varray[optvarrayindfirst[0+i]].vert1z);
  10.     END;
  11. glEnd();


das funktioniert und die normalen sind ok.

Um zum Punkt zu kommen, bräuchte ich eine hilfe wie ich genau für gldrawelements die normalen bereitstellen muß.

Danke euch schonmal

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Fr Dez 18, 2009 08:52 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Wölfchen hat geschrieben:
N2array ist dabei mein array mit den normalen... ich haber auch ein indexarray für die normalen aber keine ahnung wie ich es verwenden kann...
Was genau steht im Normalenindexarray anderes drin als im Vertexindexarray? So wie du in deinem letzten Codeschnippsel das Zeichnen mit glBegin beschreibst müssten beide ja identisch sein. Also ich kann jetzt gerade keinen Fehler erkennen.
glNormalPointer nimmt vermutlich keinen Parameter für die Anzahl der Koordinaten auf, weil kein Bedarf da ist. Außer für die Verrechnung mit Lichtquellen fällt mir keine gute Verwendung für Normalen ein und die haben auch alle 3 Koordinaten. Also sei unbesorgt, die 3 steht zwar nicht da, eine Normale ist aber so definiert wie du schon schreibst - wie dein TVertex.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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 | 15 Queries | GZIP : On ]