Deutsch
Forum

glEnableClientState XProfan Absturz bei ~GL_NORMAL_ARRAY

 

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

35 kB
Hochgeladen:01.06.2007
Ladeanzahl33
Herunterladen
 
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.
 
01.06.2007  
 




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:
KompilierenMarkierenSeparieren
REM ---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&)
 
01.06.2007  
 



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.
 
01.06.2007  
 




Andreas
Gaida
bei mir stürzt es bei :
KompilierenMarkierenSeparieren
oGL(glNormalPointer,3,$140A,0,vertex_NF4#)

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}.
 
01.06.2007  
 




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:
KompilierenMarkierenSeparieren
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(*glNormalPointer*,3,$140A,0,VERTEX_NF4#)
 
01.06.2007  
 




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*
 
01.06.2007  
 




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 .
KompilierenMarkierenSeparieren
Declare 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  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.841 Betrachtungen

Unbenanntvor 0 min.

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

Andreas Gaida (8x)
iF (8x)
RGH (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie