Forum | | | | - Seite 1 - |
| 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 ▲ |
| |
| | | | | - Seite 1 - |
| | 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 ▲ |
| |
| | | | - Seite 2 - |
| | | KompilierenMarkierenSeparierenREM ---FILE---
CLS
DATEN_INIT
PROCEED PROCEDURE { proc DATEN_INIT }/* LINE:27 {
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
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
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
}
OGL(*Init*, %HWND, 0, 0, 0, 1)
@SET(*oGLDepth*, 1000)
SETTIMER 20
WHILENOT { WHILENOT ENDE% } /* LINE:10 {
WAITINPUT
DRAWGLSCENE
PROCEED PROCEDURE { proc DRAWGLSCENE } /* LINE:15 {
OGL(*Clear*)
OGL(*Move*, 0,-0.0, -5.0)
OGL(*glEnableClientState*,$8075)
OGL(*glEnableClientState*,$8074)
OGL(*glNormalPointer*,3,$140A,0,VERTEX_NF4#)
|
| | | | |
| | Andreas Gaida | THX
Aber ich bin am ende der Fehler steck irgendwo in dem Befehl OGL(*glNormalPointer*,3,$140A,0,VERTEX_NF4#) Bin davon überzeugt das die Arrays soweit in ordnung sind wieso der Befehl abschmiert keine ahnung aber solange das so ist kann ich OpenGl vergessen ,die anderen Befehle sind bei den Datenmengen die ich für eine 3D Animation aus obj dateien machen wollte einfach zu lahm
MfG Andreas |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | RGH | Hallo Andreas,
ich fürchte, Du hast die Microsoft-Hilfe zu OpenGL nicht ausführlich genug studiert! glNormalPointer hat da einen Parameter weniger:
[...]
The glNormalPointer function defines an array of normals.
void glNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer );
Parameters
type - The data type of each coordinate in the array using the following symbolic constants: GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, and GL_DOUBLE. stride - The byte offset between consecutive normals. When stride is zero, the normals are tightly packed in the array. pointer - A pointer to the first normal in the array.
Gruß Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.06.2007 ▲ |
| |
| | RGH | Nochmal ich:
So geht es also: KompilierenMarkierenSeparieren
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,~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
Trotzdem ein Hinweis: Noch einen Tick schneller geht es mit XPGL. Schaue Dir doch mal das Kapitel XPGL 4: XPGL binär - XPGL im Programm in der Hilfe (OpenGL-Kurs) an. Im zweiten Abschnitt wird gezeigt, wie man ohne OpenmGL-API direkt in Profan mit Datenarray arbeitet! Und wenn Du die vorhergehenden Abschnitte durcharbeitest, efährtst Du auch, was man sonst noch mit XPGL anstellen kann. Ein Beispiel zeigt übrigens das Kapitel Lektion 10: Wandern durch 3D-Welten mit XPGL.
Gruß Roland |
| | | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 01.06.2007 ▲ |
| |
| | Andreas Gaida | Vielen Dank !
Ich muss leider zugeben das ich nicht mit der Microsoft hilfe gearbeitet habe sondern den Quelcode von C aus dem Internet habe :
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);
was sich jetzt leider als ein schwerer fehler für mich erwiesen hat . Ich werde mich doch lieber auf Microsoft in Zukunft verlassen. Ich möchte mich bei Dir und IF nochmals für die Hilfe bedanken und mich für die Umstände die ich gemacht habe entschuldigen .
MfG Andreas |
| | | Athlon X2 4800 , 2GB Ram , GeForce 7800GT Windows XP Pro , XProfan 10 und 11 , Profan2Cpp 1.6b | 01.06.2007 ▲ |
| |
| | | Du musst Dich keinesfalls entschuldigen! |
| | | | |
|
AntwortenThemenoptionen | 3.837 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |