| |
|
|
Andreas Gaida | Hi! Habe ein Problem mit glDrawArrays Befehl irgendwie bekomme ich ihm seit vielen Tagen und Internet suche nicht so zum funktionieren wie er es soll. Habe schon paar Dutzend Varationen versucht ohne erfolg vielleicht sehe ich nur den Wald vor Lauter Bäumen nicht Ich wäre sehr dankbar für Hilfe bei dem Problem.
Mfg Andreas KompilierenMarkierenSeparierenBeispielcode des Problem :
Declare Dateiname$,Datei$,ab$,rückgabe&,ende%,byt_count&
Declare vertex_P#,vertex_N#,vertex_T#,vertex_F3#,vertex_F4#,quad_A#
Declare zähler_P&,zähler_N&,zähler_T&,zähler_F&,zähler_F3&,zähler_F4&
daten_init Initialisiert Bereiche und füllt sie mit Daten
cls
oGL(Init, %hWnd, 0, 0, 0, 1)
@Set(oGLDepth, 1000)
oGL(glEnableClientState,~GL_VERTEX_ARRAY)
print oGL(glIsEnabled,~GL_VERTEX_ARRAY)
oGL(glVertexPointer,3,~GL_FLOAT,0,@Addr(quad_A#))
setTimer 20 max. 50 Frames /sek.
WhileNot ende%
WaitInput
DrawGLScene
EndWhile
ende_init
proc DrawGLScene
oGL(Clear)
oGL(Move, 0,0, -4)
quad wenn aktiviert zeigt Quadrat an wie es aussehen soll
oGL(glDrawArrays,~GL_QUADS, 0, 12) soll Quadrat zeichnen aus einen Bereich heraus
oGL(Show)
endproc
proc quad
rückgabe& =oGL(glBegin,~GL_QUADS)
oGL(glVertex3f,@Float(quad_A#, 0),@Float(quad_A#, 8),@Float(quad_A#, 16))
oGL(glVertex3f,@Float(quad_A#, 24),@Float(quad_A#, 32),@Float(quad_A#, 40))
oGL(glVertex3f,@Float(quad_A#, 48),@Float(quad_A#, 56),@Float(quad_A#, 64))
oGL(glVertex3f,@Float(quad_A#, 72),@Float(quad_A#, 80),@Float(quad_A#, 88))
rückgabe& = oGL(glEnd)
endproc
proc daten_init
Dim vertex_P# ,24000000
Dim vertex_N# ,24000000
Dim vertex_T# ,16000000
Dim vertex_F3#,12000000
Dim vertex_F4#,12000000
Dim quad_A# ,12000000
byt_count& = 0 Wenn 4 Zeigt glDrawArrays was an aber nicht das was es soll
Float quad_A#, (0 +byt_count&) = 0.0
Float quad_A#, (8 +byt_count&) = 1.0
Float quad_A#, (16+byt_count&) = 1.0
Float quad_A#, (24+byt_count&) = 0.0
Float quad_A#, (32+byt_count&) = 0.0
Float quad_A#, (40+byt_count&) = 1.0
Float quad_A#, (48+byt_count&) = 1.0
Float quad_A#, (56+byt_count&) = 0.0
Float quad_A#, (64+byt_count&) = 1.0
Float quad_A#, (72+byt_count&) = 1.0
Float quad_A#, (80+byt_count&) = 1.0
Float quad_A#, (88+byt_count&) = 1.0
endproc
proc ende_init
Dispose vertex_P#
Dispose vertex_N#
Dispose vertex_T#
Dispose vertex_F3#
Dispose vertex_F4#
Dispose quad_A#
endproc
Administratorische Anmerkung: Für Quellcodes bitte den CODE-Tag benutzen. |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 27.05.2007 ▲ |
|
|
|
|
Frank Abbing | Da gehst du wohl falsch vor. Wie ich es verstanden habe, musst du dafür eine Display-Liste benutzen:
[web]https://wiki.delphigl.com/index.php/Displaylisten[/web] Mit glNewList eine neue Liste starten, diese füllen und dann mit glCallList anzeigen. Roland hat aber Display-Listen eingebaut. Vielleicht solltest du diese benutzen, anstatt selber welche per API nachzubauen. |
|
|
| |
|
|
|
Andreas Gaida | Hi! glDrawArrays kann in Displaylisten vorkommen. Aber seine aufgabe ist es Vertex Daten aus Arrays schnell aus dem Arbeitsspeicher zu Zeichnen. Z.B kann man mit einen Aufruf 10000 Dreiecke auf einmal Zeichnen oder in eine Displayliste einfügen Displaylisten werden im Speicher der Grafikkarte gehalten und sind sehr schnell aber leider eignen sie sich nur für Statische Objekte und der Platz des Speichers ist leider begrenzt will man nun Animationen erstellen braucht man eine schnelle Möglichkeit viele 3D Daten neu zu Zeichnen. diese Methode: rückgabe& =oGL(glBegin,~GL_QUADS) oGL(glVertex3f,@Float(quad_A#, 0),@Float(quad_A#, 8),@Float(quad_A#, 16)) oGL(glVertex3f,@Float(quad_A#, 24),@Float(quad_A#, 32),@Float(quad_A#, 40)) oGL(glVertex3f,@Float(quad_A#, 48),@Float(quad_A#, 56),@Float(quad_A#, 64)) oGL(glVertex3f,@Float(quad_A#, 72),@Float(quad_A#, 80),@Float(quad_A#, 88)) rückgabe& = oGL(glEnd) ist dafür einfach zu langsam ,glDrawArrays müste mindestens 10 mal so schnell sein wenn nicht noch viel schneller . Leider weis ich nicht wieso die umsetzung der C Beispiele nach XProfan nicht Funktioniert
C Beispiel : glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertex); glDrawArrays(GL_TRIANGLES, 0, 6);
Ganzer Queltext: [...]
MfG Andreas |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 27.05.2007 ▲ |
|
|
|
|
Andreas Gaida | Hi! Kann mir vielleicht jemand sagen wie die Daten des C Arrays in Xprofan ganz genau nachgebildet werden können(müssen Byte genau die gleiche anordnung im Speicher haben) oder welche Position die einzelnen Teile des C Arrays in einen Bereich einnehmen würden.
Für diese Informationen wäre ich sehr dankbar.
C Array : GLfloat vertex[4][3]={{-5.0f, 5.0f, 0.0f}, {-5.0f, -5.0f, 0.0f }, {5.0f, -5.0f, 0.0f }, {5.0f, 5.0f, 0.0f }};
MfG Andreas |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 29.05.2007 ▲ |
|
|
|
|
| |
|
| |
|
|
|
Andreas Gaida | THX
Auf diese Art habe ich es auch schon versucht
Dim quad_A# ,120000 byt_count& = 0 Float quad_A#, (0 +byt_count&) = 0.0 Float quad_A#, (8 +byt_count&) = 1.0 Float quad_A#, (16+byt_count&) = 1.0 Float quad_A#, (24+byt_count&) = 0.0 Float quad_A#, (32+byt_count&) = 0.0
habe keine ahnung weshalb der glDrawArrays Befehl nicht funktioniert habe mich bisher an die hoffnung geklammert das ich das Array falsch bestückt habe aber die ist damit wohl hinfällig.
MfG Andreas |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 30.05.2007 ▲ |
|
|
|
|
| Mach mal ein lauffähiges Minimalbeispiel - aus dem auch ersichtlich ist wie Du das Array übergibst. Und Codes bitte immer mit KompilierenMarkierenSeparieren[/CODE] kennzeichnen! |
|
|
| |
|
|
|
Andreas Gaida | Das erste Programm dieses Treads ist das Beispiel Programm in der Procedure daten_init werden dem Array die zugehörigen Daten übergeben. Die Procedure quad zeigt wenn sie aktiviert wird wie es ausehen sollte. Leider klapt es mit der anderen Methode mit glDrawArrays nicht das gleiche zu zeichnen . wenn ich den ersten Float wert des Arrays von 0.0 auf 1.0 ändere zeichnet glDrawArrays etwas aber nicht das richtige. mit diesem Code wird das Array dem glDrawArrays Befehl zur verfügung gestellt: KompilierenMarkierenSeparieren Bisher ist es mir nicht gelungen die Daten im Array so anzulegen das ich das gleiche ergebniss bekomme wie mit der quad Procedure.Obwohl ich schon sehr viele verschiedene anordnungen versucht habe weswegen ich nicht weis ob ich da einen Fehler mache oder der vielleicht in Profan liegt . |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 30.05.2007 ▲ |
|
|
|
|
| Probiere mal mit Doubles statt mit Floats! |
|
|
| |
|
|
|
| Nachtrag ich hatte hier warscheinlich im OGL-Bereich einen OGL-Source gepostet welcher nach diesem Prinzip eine ganze Szene zeichnet in der man sich auch bewegen kann. Sogar mit Spiegelung auf dem Boden etc - schau mal im OGL-Bereich nach Codes von mir - vielleicht hilfts. |
|
|
| |
|
|
|
Andreas Gaida | Ok werde nach den Codes schauen viellen Dank
MfG Andreas |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 30.05.2007 ▲ |
|
|
|
|
Andreas Gaida | Problem Gelöst Vielen Dank IF der Tip mit den Doubles hat es gebracht habe nicht gewust das das C float nur 4 Bytes hat und ging von den XProfan 8 Bytes aus das muste ja Murks geben
MfG Andreas |
|
|
| Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 31.05.2007 ▲ |
|
|
|