Autor Beitrag
Apollo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Windows 7
Delphi 3 Prof., Delphi 2005
BeitragVerfasst: Mi 15.10.08 17:46 
Ich hab mit opengl folgenden Würfel geproggt (siehe Anhang). Wie kann ich stad Farben Bilder nehmen und diese während der Laufzeit ändern? Würfel ist mit den Pfeiltasten drehbar. Danke im voraus.
mfg Apollo
Einloggen, um Attachments anzusehen!
_________________
Im Zweifelsfall immer das Richtige tun
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 15.10.08 17:53 
Hey! Hast Du Dir das Tutorial 4 von [url=www.delphigl.com]DelphiGL.com[/url] bereits durchgelesen? :)

€: Crosspost: www.delphipraxis.net...n+openglwuerfel.html
Apollo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Windows 7
Delphi 3 Prof., Delphi 2005
BeitragVerfasst: Mi 15.10.08 18:43 
Ja, Crosspost. Doppelt hält besser. Hab aber in beiden Fällen das selbe Problem: Wo bekomme ich SDL und SDL_Image her. Ohne scheint es nicht zu gehen. Danke für deine bisherige Hilfe.

_________________
Im Zweifelsfall immer das Richtige tun
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: Mi 15.10.08 20:39 
In den Tutorials, wo oben Schon tutorial 4 erwähnt wurde, wird glaub ich am Anfang gesagt das du dir das DGLSDK runterladen solltest. Andernfalls findest du es hier : www.delphigl.com/ in der Downloadsektion.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 16.10.08 09:11 
Nah. SDL und SDL_image sind dazu nicht zwingend nötig. SDL wurde in erster Linie dazu entwickelt um ein Framework zu bieten mit welchem man Platformunabhängig eine 2D oder OpenGL Anwendung ermöglichen kann. In dem Falle des Texturen Tutorials dient SDL lediglich dazu um die Textur von der Festplatte in den Speicher zu lesen und zu "entpacken". Das Hochladen der Texturen muss dann immer noch mit der Hand erledigt werden.

Alternativ dazu kann ich die den TexturenLoader glBitmap anbieten. Mit diesem ist das Hochladen der Texturen intern geregelt und das sollte dann auch besser auf die vorhanden Hardware eingehen. Der Artikel im dgl wiki ist leider nicht ganz aktuell aber vieles ist trotzdem gleich geblieben. Downloaden kannst du den von meiner Seite.

In dem Packet ist seit der 2.0 auch ein Beispiel enthalten. Wenn du JPEGs als Texturen verwenden möchtest, dann musst du das der glBitmap mitteilen. Also in der Unit glBitmap.pas unterhalb der History gibt es ein paar Defines. Für dich ist dann wohl GLB_DELPHI und GLB_DELPHI_JPEG wichtig. Dort einfach den Punkt entfernen damit es dann so aussieht. "{$define GLB_DELPHI}". Damit aktivierst du die Unterstützung von JPEG.

Anschließend kannst du sie gefahrlos einsetzen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  // Eine private Variable der Formklasse
  fTexture: TglBitmap2D;

  // Der Code der nach dem Initialisieren von OpenGL 1 Mal ausgeführt werden muss
  fTexture := TglBitmap2D.Create;          // Instanz der Klasse erstellen
  fTexture.LoadFromFile('myTex\Wall.bmp'); // Datei laden
  fTexture.GenTexture;                     // geladene Textur an OpenGL übergeben


Wenn du die Textur dann später benutzen möchtest genügt folgendes.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  Texture.Bind;
  glColor3f(111);
  glBegin(GL_QUADS);
    glTexCoord2i(00);
    glVertex2i(00);

    glTexCoord2i(10);
    glVertex2i(Texture.Width, 0);

    glTexCoord2i(11);
    glVertex2i(Texture.Width, Texture.Height);

    glTexCoord2i(01);
    glVertex2i(0, Texture.Height);
  glEnd;
  Texture.Unbind;

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Apollo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Windows 7
Delphi 3 Prof., Delphi 2005
BeitragVerfasst: Do 16.10.08 11:57 
Ok, ich hab es so gemacht wie du gesagt hats und es gibt eine gute und eine schlechte Naricht.
:D Es kommt kein Fehler und lässt sich prima ausführen.
:cry: Es ist kein Bild zu sehen.

_________________
Im Zweifelsfall immer das Richtige tun
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 16.10.08 12:34 
Wichtigste Frage zu erst. Siehst du überhaupt einen Würfel? Es macht die Sache nur komplizierter, wenn du alles auf ein Mal haben willst. Als erstes solltest du überhaupt einen Würfel sehen. Anschließend die Texturen aufbringen.

Wenn du keinen Würfel ober Flächen siehst, dann kann das auch gut daran liegen, dass die Fläche außerhalb des sichtbaren Bereiches liegen etc.
Etwas was in der DP auch ein bisschen untergegangen ist. Es wird nirgendswo ein Viewport und eine Projektion gesetzt. In deinem ersten Code setzt du die Projektionsmatrix zwar zurück aber du stellst keine Projektion ein. littleDave hatte das in seinem letzten Post wohl auch vergessen. Nach dem Initialisieren von OpenGL musst du einmal in die Projektion wechseln und diese initialisieren. Ich persönlich mache das gerne im OnResize des Fensters, da ich die Fenster gerne in der Größe anpasse und dann wird das nur gemacht wenn sich an der Fenstergröße etwas ändert. Dann musst du aber nach dem Initialisieren erst einmal OnResize manuell aufrufen. Du könntest das auch zu Beginn des Zeichnens machen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormResize(Sender: TObject);
begin
  glViewport(00, ClientWidth, ClienHeight);

  // Projection matrix
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  // Perspektive setzen
  gluPerspective(45.0, ClientWidth / ClientHeight, 2.0128.0);
end;


Bzw in der Rendermethode kann ich dir nur empfehlen als eines der ersten Aktionen die Modelview zu aktivieren und diese auf den Default zu setzen. glLoadIdentity wird bei littleDave zwar gemacht aber ohne explizites Setzen der Modelview Matrix könnte das auch eine Andere sein. Muss man sich dann drauf verlassen. Ich mag es eher sicherer.
ausblenden Delphi-Quelltext
1:
2:
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();



Wenn du einen Würfel siehst! Den Code zum Zeichnen hatte ich aus meinem Beispiel kopiert. Und dort zeichne ich das Ganze in 2D. Vom Prinzip her musst du die Texturkoordinaten auf dein Quads übertragen. Also mit einem Stück aus der DP sollte das in etwa wie folgt aussehen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
fTexture.Bind; // Wichtig. Außerhalb von glBegin/glEnd
glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel.
  ...
  glTexCoord2f(00);
  glVertex3d(-0.5, -0.50.5); //Vorderseite

  glTexCoord2f(01);
  glVertex3d(-0.50.50.5);

  glTexCoord2f(11);
  glVertex3d(0.50.50.5);

  glTexCoord2f(10);
  glVertex3d(0.5, -0.50.5);

Es kann sein, dass die Textur nicht richtig aussieht (kopf steht etc). Das ist etwas womit ich mich aus dem Stehgreif auch nach 1-7 Jahren ab und an schwer tue. ;) Mit glTexCoord2f setzt du die Texturkoordinaten. Also der Punkt der Textur der an diesem Vertex benutzt werden soll. Die Textur wird dann über das Dreieck gespannt.

Wichtig ist, dass du die Textur nicht innerhalb eines glBegin/glEnd Blockes bindest oder aktivierst. Das wird sonst einfach kommentarlos ignoriert.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Apollo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Windows 7
Delphi 3 Prof., Delphi 2005
BeitragVerfasst: Do 16.10.08 13:02 
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, opengl, StdCtrls, glBitmap, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormResize(Sender: TObject);

     procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject) ;
      procedure FormPaint(Sender: TObject);
 procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);



  private
  mydc : HDC;
myrc : HGLRC;
myPalette : HPALETTE;
  fTexture: TglBitmap2D;
  procedure SetupPixelFormat;
      procedure Objekt;


    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  rotx : integer;
  roty : integer;


implementation
        {$R *.dfm}


 procedure Tform1.SetupPixelFormat;
var
  hheap : Thandle;
  ncolors,i : integer;
  lppalette : plogpalette;
  byredmask, bygreenmask, bybluemask : byte;
  npixelformat : integer;
  pfd : Tpixelformatdescriptor;
begin
  Fillchar(pfd,sizeof(pfd),0);
  with pfd do
  begin
    nsize := sizeof(pfd);
    nversion := 1;
    dwflags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or   PFD_DOUBLEBUFFER;
    ipixeltype := PFD_TYPE_RGBA;
    cColorbits := 24;
    cdepthbits := 32;
    ilayertype := PFD_Main_Plane;
  end;
  nPixelFormat:= ChoosePixelFormat(myDC, @pfd);
  SetPixelFormat(myDC, nPixelFormat, @pfd);
  DescribePixelFormat(myDC, nPixelFormat,sizeof(TPixelFormatDescriptor),pfd);
  if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0then
  begin
    nColors := 1 shl pfd.cColorBits;
    hHeap := GetProcessHeap;
    lpPalette:= HeapAlloc (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry)));
    lpPalette^.palVersion := $300;
    lpPalette^.palNumEntries := nColors;
    byRedMask := (1 shl pfd.cRedBits) - 1;
    byGreenMask:= (1 shl pfd.cGreenBits) - 1;
    byBlueMask := (1 shl pfd.cBlueBits) - 1;
    for i := 0 to nColors - 1 do begin
   lpPalette^.palPalEntry[i].peRed := (((i shr pfd.cRedShift) and byRedMask) *255)DIV   byRedMask;
   lpPalette^.palPalEntry[i].peGreen:= (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask;
    lpPalette^.palPalEntry[i].peBlue := (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask;
    lpPalette^.palPalEntry[i].peFlags:= 0;
  end;
  myPalette:= CreatePalette(lpPalette^);
  HeapFree(hHeap, 0, lpPalette);
  if (myPalette <> 0then
  begin
    SelectPalette(myDC, myPalette, False);
    RealizePalette(myDC);
  end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.myDC:= GetDC(Handle);
  SetupPixelFormat;
  myRC:= wglCreateContext(myDC);
  wglMakeCurrent(myDC, myRC);
  glEnable(GL_DEPTH_TEST);
  glLoadIdentity;
  
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
       wglmakecurrent(0,0);
  wgldeletecontext(mydc);
  releasedc(handle,mydc)
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
        Objekt;   
end;

 procedure tform1.Objekt;
begin
  glClearColor(000.01); // HintergundFarbe
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  glMatrixMode(GL_PROJECTION); // Darstellungsmodus = Projektionsmodus
  glLoadIdentity;
  glPolygonMode(GL_FRONT, GL_FILL); // Nur Vorderseiten darstellen (schneller) / Füllmodus : gefüllte Objekte
  glMatrixMode(GL_MODELVIEW); // Koordinatensystem drehen
  glLoadIdentity; // Setzt alles zurück auf Uhrsprungspunkt(sehr wichtig!)-ansonsten wird die Scene irgendwo dargestellt, aber nicht da, wo sie hin soll
  glPushmatrix();
  glcolor3f(1,1,0);
  glrotate(rotx,1,0,0); //drehung um die x-achse
glrotate(roty,0,1,0); //drehung um die y-achse
 glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
    fTexture.Bind;
  glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel.

glVertex3d(0.5, -0.50.5); //Linke Seite
glVertex3d(-0.5, -0.50.5);
glVertex3d(-0.5, -0.5, -0.5);
glVertex3d(0.5, -0.5, -0.5);
      glcolor3f(1,0,0);
glVertex3d(-0.5, -0.5, -0.5); //Rückseite
glVertex3d(-0.50.5, -0.5);
glVertex3d(0.50.5, -0.5);
glVertex3d(0.5, -0.5, -0.5);
       glcolor3f(1,0,1);
glVertex3d(0.5, -0.5, -0.5); //Oberseite
glVertex3d(0.50.5, -0.5);
glVertex3d(0.50.50.5);
glVertex3d(0.5, -0.50.5);
           glcolor3f(0,1,0);
glVertex3d(-0.5, -0.50.5); //Vorderseite
glVertex3d(-0.50.50.5);
glVertex3d(0.50.50.5);
glVertex3d(0.5, -0.50.5);
                glcolor3f(1,0.5,0);
glVertex3d(-0.5, -0.50.5); //Boden / Unterseite
glVertex3d(-0.50.50.5);
glVertex3d(-0.50.5, -0.5);
glVertex3d(-0.5, -0.5, -0.5);
                 glcolor3f(0,0,1);
glVertex3d(-0.50.50.5); //Rechte Seite
glVertex3d(0.50.50.5);
glVertex3d(0.50.5, -0.5);
glVertex3d(-0.50.5, -0.5);

 fTexture := TglBitmap2D.Create;          // Instanz der Klasse erstellen
  fTexture.LoadFromFile('C:\Dokumente und Einstellungen\Mein_Name\Eigene Dateien\Eigene Bilder\test tztur.bmp'); // Datei laden
  fTexture.GenTexture;                     // geladene Textur an OpenGL übergeben
glEnd();
  SwapBuffers(form1.myDC); //scene darstellen



end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key = vk_down then
  begin
    rotx := rotx+1;
  end;

  if key = vk_up then
  begin
    rotx := rotx-1;
  end;

  if key = vk_right then
  begin
    roty := roty+1;
  end;

  if key = vk_left then
  begin
    roty := roty-1;
  end;
  repaint;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
   glViewport(00, ClientWidth, ClientHeight);

  // Projection matrix
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  // Perspektive setzen
  gluPerspective(45.0, ClientWidth / ClientHeight, 2.0128.0);
end;

end.


Das ist mein gesammter Code. Wenn ich ihn ausführe gibt es irgendwie eine Zugriffsverletzung :gruebel:
Bitte, Bitte hilf mir!!!

_________________
Im Zweifelsfall immer das Richtige tun
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 16.10.08 13:16 
Hast du mal den Debugger benutzt, um zu schauen, wo genau der Fehler auftritt?

_________________
PROGRAMMER: A device for converting coffee into software.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 16.10.08 14:12 
Okay. Also wenn du mich fragst solltest du dir mal ein Template von DGL anschauen. Dort dann unter unter "Templates" das "OpenGL 1.5 Template (VCL)". Die dglOpenGL.pas findest du im zugehörigen WikiArtikel. Das Template ist sicher nicht perfekt aber OpenGL wird anständig initialisiert und benötigte Werte werden auch vernünftig gesetzt. Das ist bei dir mal ganz vorsichtig ausgedrückt sehr sehr durcheinander. Aber auch verständlich, denn OpenGL ist nicht so einfach und das kann einen förmlich erschlagen.

Ich würde dir erst mal raten, dass du versuchst das Template ans Laufen zu bringen. Als nächstes solltest du dann versuchen einen Würfel zu zeichnen. Wenn das klappt. Aber auch nur dann, kannst du diesen Würfel mit Texturen zu bekleben. Ansonsten bringt das alles nicht. Du musst zu mindest ansatzweise verstehen was da vor geht. Warum das genau so ist und nicht anders ist nicht wichtig. Aber wenigstens Grundlagen solltest du verstehen. Da kann ich dir auch bedenkenlos die Einsteiger Tutorial empfehlen.

Das Template läuft:
Dein Objekt kannst du dann VOR dem Funktionsaufruf ShowText in der Methode TGLForm.ApplicationEventsIdle zeichnen. Bedenke aber, dass alle Punkte die eine Tiefe kleiner als 1 haben abgeschnitten werden. Genau so auch alle deren Tiefe Größe als 128 ist. Um das zu Kompensieren genügt ein Aufruf von glTranslate mit einer Negativen Tiefe so um die 5, dann liegt der koordinaten Nullpunkt innerhalb des sichtbaren Bereiches. Wenn das nicht wäre und du etwas zeichnen würdest wäre es einfach nicht da.
ausblenden TGLForm.ApplicationEventsIdle
1:
2:
3:
4:
5:
6:
7:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glTranslatef(00, -5); // neu

// hier Würfel/Flächen etc. zeichnen

ShowText;


Würfel ist da und nun bekleben:
Das Laden der Texturen solltest du grundsätzlich immer direkt nach dem Initialisieren erledigen. Wenn du weißt was man da tun kann/muss ist es auch an anderen Stellen möglich. Aber aktuell solltest du es NUR da machen. Im genauen meine ich da die Methode TGLForm.FormCreate direkt nach dem Aufruf der Methode BuildFont('MS Sans Serif');. Wärend dem Rendern rufst du dann nur noch Bind und Unbind auf.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Jerk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 251

Vista Ultimate, Ubuntu
Turbo Delphi 2006
BeitragVerfasst: Fr 17.10.08 00:11 
Fehlt bei ihmn nicht glEnable(GL_TEXTURE_2D); ?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 17.10.08 10:42 
user profile iconJerk hat folgendes geschrieben Zum zitierten Posting springen:
Fehlt bei ihmn nicht glEnable(GL_TEXTURE_2D); ?

Im Prinzip hast du recht. Aber hier wird das bereits von der glBitmap beim Binden durchgeführt. Denn die glBitmap kann auch andere Targets annehmen und damit würde das intern geregelt werden.

Aber um genau zu sein was an dem Code nicht stimmt.
- Die Textur wird innerhalb des Renderns geladen. Wenn die Textur nicht wieder gelöscht wird entsteht so ein sehr großes Speicherloch. Es ist der Performancekiller schlechthin. Die Textur wird obendrein zwischen glBegin und glEnd geladen. Okay. Das könnte zu mindest das Speicherloch verhindern, denn dort ist das Erstellen einer Textur nicht erlaubt und die Aufrufe werden ignoriert.
- Die Texturinstanz wird zu erst gebunden und anschließen erstellt. Ich denke genau dadurch entsteht die Zugriffsverletzung. Denn die Instanz der Delphiklasse existiert noch nicht wo schon darauf zugegriffen wird.
- Die Perspektive wird zwar gesetzt aber nur, wenn sich das Fenster in der Größe verändert. Da müsste man nach dem Initialisieren von OpenGL noch mal per Hand FormResize aufrufen. Aber das wäre egal, da beim Zeichnen die Perspektive immer wieder gelöscht wird. (Muss ich mir auch ankreiden. Das hatte ich nicht erwähnt, dass man das da dann entfernen muss)
- Erschwerend kommt hinzu, dass die Objekte von der Tiefe her geringer sind als zNear und somit würden sie nicht mal dargestellt werden selbst wenn die Pespektive vernünftig gesetzt wird. Die Modelview Matrix wird aber auch da nach dem setzten der Rotation wieder gelöscht. Womit die Rotation etc hinfällig wäre.
- Außerdem wird innerhalb der Zeichenmethode die Modelviewmatrix auf den Stack gepackt (glPushmatrix) aber nicht wieder heruntergenommen. Das glPushmatrix ist da aber auch nicht nötig, da die Matrix vorher mit glLoadIdentity zurückgesetzt wurde. Somit würde man eine leere Matrix sichern.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.