Forum | | | | Andreas Gaida | Hi! Bei mir verursacht glEnableClientState in verbindung mit ~GL_NORMAL_ARRAY einen Program absturz in XProfan sowie auch mit Profan2CPP. Während die anderen Arrays sich ohne Probleme aktivieren lassen macht dieser Ärger was sehr schade ist weil in verbindung mit glVertexPointer und glDrawArrays ist er sehr schnell bei zeichnen vieler Objekte. Ich hoffe es kann mir einer Helfen bei dem Problem.
Wenn im Beispiel Code in der Procedure DrawGLScene der oGL(glEnableClientState,$8075) aktiviert wird stürzt das Programm sofort bei erreichen der stelle ab. als Anhang habe ich einen Vollständigen Quellcode mit obj Datei angehängt .Das Programm liest die obj Datei ein und stellt die Vertex dar ,die Problem stelle für die Normalen ist noch auskommentiert. Beim aktivieren dieser stelle in der proc DrawGLScene Stürzt das Programm ab . Für Hilfe wäre ich sehr Dankbar. KompilierenMarkierenSeparieren
proc DrawGLScene
oGL(Clear)
oGL(Move, 0,-0.2, -1.0)
--------------------- Vierecke zeichnen -----------------------------------------------
oGL(glEnableClientState,$8075) Normale Array aktivieren $8075 = ~GL_NORMAL_ARRAY
oGL(glEnableClientState,$8074) Vertex Array aktivieren $8074 = ~GL_VERTEX_ARRAY
oGL(glNormalPointer,3,$140A,0,vertex_NF4#) Normale Array definieren $140A = ~GL_DOUBLE
oGL(glVertexPointer,3,$140A,0,vertex_VF4#) Vertex Array definieren
oGL(glDrawArrays,~GL_QUADS, 0 ,zähler_VF4&) Vertex Array zeichnen
oGL(glDisableClientState,$8074) glDisableClientState
oGL(glDisableClientState,$8075) Normale Array deaktivieren
--------------------- Dreicke zeichnen -----------------------------------------------
oGL(glEnableClientState,$8075) Normale Array aktivieren $8075
oGL(glEnableClientState,$8074) Vertex Array aktivieren $8074
oGL(glNormalPointer,3,$140A,0,vertex_NF3#) Normale Array definieren
oGL(glVertexPointer,3,$140A,0,vertex_VF3#) Vertex Array definieren
oGL(glDrawArrays,~GL_TRIANGLES, 0 ,zähler_VF3&) Vertex Array zeichnen
oGL(glDisableClientState,$8074) Vertex Array deaktivieren
oGL(glDisableClientState,$8075) Normale Array deaktivieren
---------------------------------------------------------------------------------------
oGL(Show)
GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, und GL_POLYGON.
endproc
MfG Andreas |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Gibt es einen Beispielcode eines anderen Herstellers z.B. in C oder Pascal? Es könnte sein dass das Aktivieren eines Normale-Arrays an anderer Stelle aufgerufen werden muss. Erfahrung damit habe ich jedoch leider nicht. |
| | | | |
| | Andreas Gaida | C Beispiel: glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(3, GL_FLOAT, 0, color); glTexCoordPointer(2, GL_FLOAT, 0, texcoord); glNormalPointer(3, GL_FLOAT, 0, normal); glVertexPointer(3, GL_FLOAT, 0, vertex);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, all_indices);
Code von [...]
Beispiel 2 aus anderer Quelle : glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(vcoordPerVertex,type,stride,vpointer); glNormalPointer(ncoordPerVertex,type,stride,npointer); glColorPointer(ccoordPerVertex,type,stride,cpointer); glTexCoordPointer(tcoordPerVertex,type,stride,tpointer);
glDrawArrays(geoMode, first, count); |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Tjah! Vielleicht solltest Du Dir mal xpse angewöhnen.
Hab mal mit {$debug} Deinen Code durchlaufen und es ist anders als Du oben sagst - das Programm stürzt an anderer Stelle ab! Hier der Auszug aus dem xpsedebugmodus für Dein Programm, die letzte Zeile ist die Zeile welche wirklich zum Absturz führt: KompilierenMarkierenSeparierenREM ---FILE---
CLS
DATEN_INIT
PROCEED PROCEDURE { proc DATEN_INIT }/* LINE:32 {
DIM VERTEX_P# ,240000
DIM VERTEX_N# ,240000
DIM VERTEX_T# ,160000
DIM VERTEX_VF3#,120000
DIM VERTEX_VF4#,120000
DIM VERTEX_NF3#,120000
DIM VERTEX_NF4#,120000
DIM QUAD_A# ,120000
}
LADEN *test.obj*
PROCEED PROCEDURE { proc LADEN } /* LINE:122 {
DECLARE AB$
IF { IF @FILEEXISTS(DATEI$) } /* LINE:125 {
WINDOWTITLE *Lade OBJ Datei xxx*
...
WINDOWTITLE *Geladen *
}
}
OGL(*Init*, %HWND, 0, 0, 0, 1)
@SET(*oGLDepth*, 1000)
SETTIMER 20
WHILENOT { WHILENOT ENDE% } /* LINE:11 {
WAITINPUT
DRAWGLSCENE
PROCEED PROCEDURE { proc DRAWGLSCENE } /* LINE:16 {
OGL(*Clear*)
OGL(*Move*, 0,-0.2, -1.0)
OGL(*glEnableClientState*,$8075)
OGL(*glEnableClientState*,$8074)
OGL(*glVertexPointer*,3,$140A,0,VERTEX_VF4#)
OGL(*glDrawArrays*,7, 0 ,ZäHLER_VF4&)
|
| | | | |
| | | Nachtrag: Im Übrigen müsstest Du dann auch nicht alle Konstanten definieren - es sind bereits alle definiert. Du könntest einfach gleich die Konstantenbezeichnung tippen. |
| | | | |
| | Andreas Gaida | bei mir stürzt es bei : KompilierenMarkierenSeparieren ab .Mit Windowtitle bekomme ich bis dahin noch eine ausgabe danach nicht mehr.
wenn oGL(glNormalPointer,3,$140A,0,vertex_NF4#) Normale Array definieren $140A = ~GL_DOUBLE auskommentiert ist stürzt es bei glDrawArrays ab sonst bei glNormalPointer hatte beide befehle im beispiel auskommentiert.
wobei ich nicht verstehe wieso ?
Habe die Konstanten nicht verwendet weil mir Profan2CPP die nicht angenommen hat. |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Windowttitle ist denkbar ungeeignet zum debuggen - da ein sendmessage gesendet wird. Du wirst damit also eben nicht immer die wirkliche Absturzstelle finden. Aber wenn Du dem Windowtitle mehr Vertrauen schenkst als dem echten Debugoutput des xpse dann werden wir aneinander vorbei reden müssen - hiernach kann ich dann aber nicht mehr helfen.
Wenn Du dennoch meine Vermutung hören möchtest: Da glDrawArrays abstürzt wird das Array falsch befüllt sein.
Habe die Konstanten nicht verwendet weil mir Profan2CPP die nicht angenommen hat.
Wer mit XPSE arbeitet hat solche Probleme nicht. Es gibt sogar einen extra Schalter {$cpp}. |
| | | | |
| | Andreas Gaida | Ich glaube dir ja aber ich habe im quelltext 2 zeilen ausdokummentiert wenn beide aktiv sind stürtzt es schon bei den glVertexPointer befehl ab es stürzt auch ab wenn glDrawArrays ausdokummentiert wird was gegen eine falsche bestückung des befehls spricht oder bin ich da so sehr auf dem holzweg
dieser code müsste früher abstürzen und wenn mann glDrawArrays ausdokummentiert stürtzt er trotzdem ab
Könntest du diesen teil in das Beispiel einfügen und es nochmal debugen ? KompilierenMarkierenSeparieren
proc DrawGLScene
oGL(Clear)
oGL(Move, 0,-0.2, -1.0)
--------------------- Vierecke zeichnen -----------------------------------------------
oGL(glEnableClientState,$8075) Normale Array aktivieren $8075 = ~GL_NORMAL_ARRAY
oGL(glEnableClientState,$8074) Vertex Array aktivieren $8074 = ~GL_VERTEX_ARRAY
oGL(glNormalPointer,3,$140A,0,vertex_NF4#) Normale Array definieren $140A = ~GL_DOUBLE
oGL(glVertexPointer,3,$140A,0,vertex_VF4#) Vertex Array definieren
oGL(glDrawArrays,~GL_QUADS, 0 ,zähler_VF4&) Vertex Array zeichnen
oGL(glDisableClientState,$8074) glDisableClientState
oGL(glDisableClientState,$8075) Normale Array deaktivieren
--------------------- Dreicke zeichnen -----------------------------------------------
oGL(glEnableClientState,$8075) Normale Array aktivieren $8075
oGL(glEnableClientState,$8074) Vertex Array aktivieren $8074
oGL(glNormalPointer,3,$140A,0,vertex_NF3#) Normale Array definieren
oGL(glVertexPointer,3,$140A,0,vertex_VF3#) Vertex Array definieren
oGL(glDrawArrays,~GL_TRIANGLES, 0 ,zähler_VF3&) Vertex Array zeichnen
oGL(glDisableClientState,$8074) Vertex Array deaktivieren
oGL(glDisableClientState,$8075) Normale Array deaktivieren
---------------------------------------------------------------------------------------
oGL(Show)
endproc
|
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Warum tust Du es nicht einfach selbst?
Gekürzter Auszug - unteres Ende ist Programmabbruch: KompilierenMarkierenSeparierenOGL(*Init*, %HWND, 0, 0, 0, 1)
@SET(*oGLDepth*, 1000)
SETTIMER 20
WHILENOT { WHILENOT ENDE% }/* LINE:11 {
WAITINPUT
DRAWGLSCENE
PROCEED PROCEDURE { proc DRAWGLSCENE } /* LINE:16 {
OGL(*Clear*)
OGL(*Move*, 0,-0.2, -1.0)
OGL(*glEnableClientState*,$8075)
OGL(*glEnableClientState*,$8074)
OGL(*glNormalPointer*,3,$140A,0,VERTEX_NF4#)
|
| | | | |
| | Andreas Gaida | Danke schöne . Dachte mir bis ich das mit dem debugen drauf habe würde länger dauern und so siehste auch gleich was ich meine . Wenn ich das richtig sehe ist es also doch der glNormalPointer befehl der alles stopt .
Hast Du oder jemand anders eine Idee wieso der spinnt es wird wohl nicht an OpenGL selber liegenoder wo mache ich einen blöden Fehler bei.
Ansonsten nochmals viellen Dank für die Hilfe.
MfG Andreas |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Na es gibt einen Grund dafür - die Daten die Du übergibst sind in falscher Struktur, Du wirst demnach einfach nur einen solchen von Dir beschriebenen blöden Fehler machen. *g* |
| | | | |
| | Andreas Gaida | Hier habe ich die Daten für die Normalen in die gleiche Struktur gebracht wie die der Vertex Daten aber der Befehl stürzt immer noch ab . Habe die selben Daten als Normale verwendet wie für das Rechteck sollte aber nicht das Programm zum absturz bringen hösten merkwürdig aussehen aber die formatierung ist die gleiche wie sie bei zeichnen der Daten funktioniert. Daten werden in der daten_init initialisiert.
Also ich gehe auch meisten davon aus das der Fehler bei mir liegt aber in diesem Fall fange ich an langsam daran zu zweifeln. Währe aber trotzdem sehr froh darüber falls man mir einen Fehler aufzeigen könnte . KompilierenMarkierenSeparierenDeclare Dateiname$,Datei$,ab$,rückgabe&,ende%
Declare vertex_P#,vertex_N#,vertex_T#,vertex_VF3#,vertex_VF4#,quad_A#
Declare zähler_P&,zähler_N&,zähler_T&,zähler_F&,zähler_VF3&,zähler_VF4&,vertex_NF3#,vertex_NF4#,zähler_NF4&
cls
daten_init
oGL(Init, %hWnd, 0, 0, 0, 1)
@Set(oGLDepth, 1000)
setTimer 20 max. 50 Frames /sek.
WhileNot ende%
WaitInput
DrawGLScene
EndWhile
ende_init
proc DrawGLScene
oGL(Clear)
oGL(Move, 0,-0.0, -5.0)
--------------------- Vierecke zeichnen -----------------------------------------------
oGL(glEnableClientState,~GL_NORMAL_ARRAY) Normale Array aktivieren $8075 = ~GL_NORMAL_ARRAY
oGL(glEnableClientState,~GL_VERTEX_ARRAY) Vertex Array aktivieren $8074 = ~GL_VERTEX_ARRAY
oGL(glNormalPointer,3,~GL_DOUBLE,0,vertex_NF4#) Normale Array definieren $140A = ~GL_DOUBLE
oGL(glVertexPointer,3,~GL_DOUBLE,0,vertex_NF4#) Vertex Array definieren
oGL(glDrawArrays,~GL_QUADS, 0 ,zähler_VF4&) Vertex Array zeichnen
oGL(glDisableClientState,$8074) glDisableClientState
oGL(glDisableClientState,$8075) Normale Array deaktivieren
oGL(Show)
endproc
proc daten_init
Dim vertex_P# ,240000
Dim vertex_N# ,240000
Dim vertex_T# ,160000
Dim vertex_VF3#,120000
Dim vertex_VF4#,120000
Dim vertex_NF3#,120000
Dim vertex_NF4#,120000
Dim quad_A# ,120000
-------Vertex Array wird gefüllt ein Viereck--------------
Float vertex_VF4#, 0 = 0.0
Float vertex_VF4#, 8 = 1.0
Float vertex_VF4#, 16 = 1.0
Float vertex_VF4#, 24 = 0.0
Float vertex_VF4#, 32 = 0.0
Float vertex_VF4#, 40 = 1.0
Float vertex_VF4#, 48 = 1.0
Float vertex_VF4#, 56 = 0.0
Float vertex_VF4#, 64 = 1.0
Float vertex_VF4#, 72 = 1.0
Float vertex_VF4#, 80 = 1.0
Float vertex_VF4#, 88 = 1.0
zähler_VF4& = 4
-------Normal Vertex Array wird gefüllt---------------------
Float vertex_NF4#, 0 = 0.0
Float vertex_NF4#, 8 = 1.0
Float vertex_NF4#, 16 = 1.0
Float vertex_NF4#, 24 = 0.0
Float vertex_NF4#, 32 = 0.0
Float vertex_NF4#, 40 = 1.0
Float vertex_NF4#, 48 = 1.0
Float vertex_NF4#, 56 = 0.0
Float vertex_NF4#, 64 = 1.0
Float vertex_NF4#, 72 = 1.0
Float vertex_NF4#, 80 = 1.0
Float vertex_NF4#, 88 = 1.0
zähler_NF4& = 4
endproc
proc ende_init
Dispose vertex_P#
Dispose vertex_N#
Dispose vertex_T#
Dispose vertex_VF3#
Dispose vertex_VF4#
Dispose vertex_NF3#
Dispose vertex_NF4#
Dispose quad_A#
endproc
|
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
|
AntwortenThemenoptionen | 3.849 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |