Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 04:07

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: einfacher würfel
BeitragVerfasst: Mo Jan 06, 2003 20:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
Also, ich bin wirklich neu in dieser Materie, deswegen hab ich mir mal son tutorial reingezogen:

Code:
  1. unit Unit1;
  2.  
  3.  
  4.  
  5. interface
  6.  
  7.  
  8.  
  9. uses
  10.  
  11.   Windows,opengl, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.  
  13.   Dialogs;
  14.  
  15.  
  16.  
  17. type
  18.  
  19.   TForm1 = class(TForm)
  20.  
  21.     procedure FormCreate(Sender: TObject);
  22.  
  23.     procedure FormDestroy(Sender: TObject);
  24.  
  25.     procedure FormPaint(Sender: TObject);
  26.  
  27.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  28.  
  29.       Shift: TShiftState);
  30.  
  31.   private
  32.  
  33.   mydc : HDC;
  34.  
  35.   myrc : HGLRC;
  36.  
  37.   myPalette : HPALETTE;
  38.  
  39.   procedure SetupPixelFormat;
  40.  
  41.     { Private-Deklarationen }
  42.  
  43.   public
  44.  
  45.     { Public-Deklarationen }
  46.  
  47.   end;
  48.  
  49.  
  50.  
  51. var
  52.  
  53.   Form1: TForm1;rotx,roty:integer;
  54.  
  55.  
  56.  
  57. implementation
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. {$R *.dfm}
  66.  
  67.  
  68.  
  69. procedure Tform1.SetupPixelFormat;
  70.  
  71. var
  72.  
  73. hheap : Thandle;
  74.  
  75. ncolors,i : integer;
  76.  
  77. lppalette : plogpalette;
  78.  
  79. byredmask, bygreenmask, bybluemask : byte;
  80.  
  81. npixelformat : integer;
  82.  
  83. pfd : Tpixelformatdescriptor;
  84.  
  85. begin
  86.  
  87. Fillchar(pfd,sizeof(pfd),0);
  88.  
  89. with pfd do
  90.  
  91. begin
  92.  
  93. nsize := sizeof(pfd);
  94.  
  95. nversion := 1;
  96.  
  97. dwflags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  98.  
  99. ipixeltype := PFD_TYPE_RGBA;
  100.  
  101. cColorbits := 24;
  102.  
  103. cdepthbits := 32;
  104.  
  105. ilayertype := PFD_Main_Plane;
  106.  
  107. end;
  108.  
  109. nPixelFormat:= ChoosePixelFormat(myDC, @pfd);
  110.  
  111. SetPixelFormat(myDC, nPixelFormat, @pfd);
  112.  
  113. DescribePixelFormat(myDC, nPixelFormat,sizeof(TPixelFormatDescriptor),pfd);
  114.  
  115. if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0) then begin
  116.  
  117. nColors := 1 shl pfd.cColorBits;
  118.  
  119. hHeap := GetProcessHeap;
  120.  
  121. lpPalette:= HeapAlloc (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry)));
  122.  
  123. lpPalette^.palVersion := $300;
  124.  
  125. lpPalette^.palNumEntries := nColors;
  126.  
  127. byRedMask := (1 shl pfd.cRedBits) - 1;
  128.  
  129. byGreenMask:= (1 shl pfd.cGreenBits) - 1;
  130.  
  131. byBlueMask := (1 shl pfd.cBlueBits) - 1;
  132.  
  133. for i := 0 to nColors - 1 do begin
  134.  
  135. lpPalette^.palPalEntry[i].peRed := (((i shr pfd.cRedShift) and byRedMask) *255)DIV byRedMask;
  136.  
  137. lpPalette^.palPalEntry[i].peGreen:= (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask;
  138.  
  139. lpPalette^.palPalEntry[i].peBlue := (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask;
  140.  
  141. lpPalette^.palPalEntry[i].peFlags:= 0;
  142.  
  143. end;
  144.  
  145. myPalette:= CreatePalette(lpPalette^);
  146.  
  147. HeapFree(hHeap, 0, lpPalette);
  148.  
  149. if (myPalette <> 0) then
  150.  
  151. begin
  152.  
  153. SelectPalette(myDC, myPalette, False);
  154.  
  155. RealizePalette(myDC);
  156.  
  157. end;
  158.  
  159. end;
  160.  
  161. end;
  162.  
  163.  
  164.  
  165. procedure Objekt;
  166.  
  167. begin
  168.  
  169. glClearColor(0, 0, 0.0, 1); // HintergundFarbe
  170.  
  171. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  172.  
  173. glMatrixMode(GL_PROJECTION); // Darstellungsmodus = Projektionsmodus
  174.  
  175. glLoadIdentity;
  176.  
  177. glPolygonMode(GL_FRONT, GL_FILL); // Nur Vorderseiten darstellen (schneller) / Füllmodus : gefüllte Objekte
  178.  
  179. glMatrixMode(GL_MODELVIEW); // Koordinatensystem drehen
  180.  
  181. glLoadIdentity; // Setzt alles zurück auf Uhrsprungspunkt(sehr wichtig!)-ansonsten wird die Scene irgendwo dargestellt, aber nicht da, wo sie hin soll
  182.  
  183. glPushmatrix();
  184.  
  185. glcolor3f(1,1,0);
  186.  
  187. glrotate(rotx,1,0,0);
  188.  
  189. glrotate(roty,0,1,0);
  190.  
  191. glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel.
  192.  
  193.  
  194.  
  195. glVertex3d(0.5, -0.5, 0.5); //Linke Seite
  196.  
  197. glVertex3d(-0.5, -0.5, 0.5);
  198.  
  199. glVertex3d(-0.5, -0.5, -0.5);
  200.  
  201. glVertex3d(0.5, -0.5, -0.5);
  202.  
  203.  
  204.  
  205. glVertex3d(-0.5, -0.5, -0.5); //Rückseite
  206.  
  207. glVertex3d(-0.5, 0.5, -0.5);
  208.  
  209. glVertex3d(0.5, 0.5, -0.5);
  210.  
  211. glVertex3d(0.5, -0.5, -0.5);
  212.  
  213.  
  214.  
  215. glVertex3d(0.5, -0.5, -0.5); //Oberseite
  216.  
  217. glVertex3d(0.5, 0.5, -0.5);
  218.  
  219. glVertex3d(0.5, 0.5, 0.5);
  220.  
  221. glVertex3d(0.5, -0.5, 0.5);
  222.  
  223.  
  224.  
  225. glVertex3d(-0.5, -0.5, 0.5); //Vorderseite
  226.  
  227. glVertex3d(-0.5, 0.5, 0.5);
  228.  
  229. glVertex3d(0.5, 0.5, 0.5);
  230.  
  231. glVertex3d(0.5, -0.5, 0.5);
  232.  
  233.  
  234.  
  235. glVertex3d(-0.5, -0.5, 0.5); //Boden / Unterseite
  236.  
  237. glVertex3d(-0.5, 0.5, 0.5);
  238.  
  239. glVertex3d(-0.5, 0.5, -0.5);
  240.  
  241. glVertex3d(-0.5, -0.5, -0.5);
  242.  
  243.  
  244.  
  245. glVertex3d(-0.5, 0.5, 0.5); //Rechte Seite
  246.  
  247. glVertex3d(0.5, 0.5, 0.5);
  248.  
  249. glVertex3d(0.5, 0.5, -0.5);
  250.  
  251. glVertex3d(-0.5, 0.5, -0.5);
  252.  
  253. glEnd();
  254.  
  255.  
  256.  
  257. SwapBuffers(form1.myDC); //scene darstellen
  258.  
  259. end;
  260.  
  261.  
  262.  
  263.  
  264.  
  265. procedure TForm1.FormCreate(Sender: TObject);
  266.  
  267. begin
  268.  
  269. form1.myDC:= GetDC(Handle);
  270.  
  271. SetupPixelFormat;
  272.  
  273. myRC:= wglCreateContext(myDC);
  274.  
  275. wglMakeCurrent(myDC, myRC);
  276.  
  277. glEnable(GL_DEPTH_TEST);
  278.  
  279. glLoadIdentity;
  280.  
  281. end;
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295. procedure TForm1.FormDestroy(Sender: TObject);
  296.  
  297. begin
  298.  
  299. wglmakecurrent(0,0);
  300.  
  301. wgldeletecontext(mydc);
  302.  
  303. releasedc(handle,mydc);
  304.  
  305. end;
  306.  
  307.  
  308.  
  309. procedure TForm1.FormPaint(Sender: TObject);
  310.  
  311. begin
  312.  
  313. objekt;
  314.  
  315. end;
  316.  
  317.  
  318.  
  319. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  320.  
  321.  &nbsp;Shift: TShiftState);
  322.  
  323. begin
  324.  
  325. if key = vk_down then
  326.  
  327. begin
  328.  
  329. rotx := rotx+1;
  330.  
  331. end;
  332.  
  333.  
  334.  
  335. if key = vk_up then
  336.  
  337. begin
  338.  
  339. rotx := rotx-1;
  340.  
  341. end;
  342.  
  343.  
  344.  
  345. if key = vk_right then
  346.  
  347. begin
  348.  
  349. roty := roty+1;
  350.  
  351. end;
  352.  
  353.  
  354.  
  355. if key = vk_left then
  356.  
  357. begin
  358.  
  359. roty := roty-1;
  360.  
  361. end;
  362.  
  363.  
  364.  
  365. repaint;
  366.  
  367.  
  368.  
  369. end;
  370.  
  371.  
  372.  
  373. end.


das meiste ist abgeschrieben, also was das bei der initialisierung alles soll weiß ich (noch) nich..

meine frage ist aber, das programm funktioniert zwar, aber es ist ja ein einfacher würfel den man mit den cursortasten drehen kann....tja und wenn man das macht fängt das fenster furtchbar zu flackern also wenn man eine cursortaste drück flackert es weiß...

kann mir da wer helfen :(

gruß Howard

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
Zitat:
glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel

stimmt nicht ganz...
zeichnet eher vierecke

Versuch außerdem mal anstatt
Code:
  1. glVertex3d(...)

das hier:
Code:
  1. glVertex3f(...)

3f weil der Compiler dann 3 floats=fließkommazahlen erwartet!

Vielleicht war das noch nicht alles...
ist mir nur auf den ersten blick aufgefallen...

Fiji-Fighter

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 21:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
erstmal danke für deine fixe antwort ^^

ändert aber leider nichts am flimmern :(


gruß Howard

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 21:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
schreib mal objects; nichts ins onpaint sondern ins
Code:
  1. procedure TForm.1ApplicationEventsIdle(Sender: TObject;
  2.  
  3.  &nbsp;var Done: Boolean);


Fiji-Fighter

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 06, 2003 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Aber dann auch Application.eventidle auf die Procedure dann verlegen.
Im Übrigen: glVertex3f erwartet 3 mal einen einfachen Float, also einen Single, glVertex3d erwartet 3 mal ein Double, das mehr Kommastellen enthalten kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
versteh das nich so ganz mit dem ganze geidle... möchte mir nicht vielleicht jemand kurz meinen code entsprechend überarbeitet posten? das wäre klasse :)

danke und gruß Howard

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
mir ist aufgefallen das, wenn ich das REPAINT am ende der onkeydown-prozedur weglasse, es ohne probleme funktioniert....ist das wichtig?

gruß Howard

edit:
ne funktioniert doch nich, man brauch das repaint wohl schon :(

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 13:56 
Offline
DGL Member

Registriert: Di Okt 29, 2002 21:20
Beiträge: 30
Ein Repaint ist in sofern wichtig, da ansonsten die änderungen in der Szene nicht gezeichnet werden.
Der Repaint des ganzen macht sich aber besser, wie schon gesagt, in der ApplicationOnIdle-Prozedur, da dann immer neu gezeichnet wird, wenn dein Programm mal "nichts zu tun" hat.
Spar die am besten die OnPaint-Prozedur und machs wie Fiji-Fighter sagte:

procedure TForm.1ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
objekt;
end;

_________________
Knowledge is Power - So ask if you want to become powerful


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 14:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wie oben ja gesagt, sollte man optimalerweise den OnIdle-Event der Form nutzen, um seine OpenGl-Szene zu zeichnen.
Dieser wird in Normalfall jedoch nicht kontinuierlich aufgerufen, sondern nur dann, wenn das Fenster eine Nachricht empfangen hat.

Wenn du deine Szene also kontinuierlich zeichnen willst um die ganze CPU-Zeit zu nutzen (was sinnvoll ist), dann mach das mit folgendem Code :
Code:
  1.  
  2.  
  3. procedure TForm.1ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  4.  
  5. begin
  6.  
  7. ZeichneSzene;
  8.  
  9. Done := False; &nbsp; // Wichtig!!!
  10.  
  11. end;
  12.  
  13.  


Die Anweisung Done := False sagt Windows quasi, das deine Anwendung die Nachrichtenschleife nicht abgearbeitet hat, und somit wird dein OnIdle-Ereignis permanent aufgerufen...nur so bekommst du für dein Programm auch die volel Prozessorzeit!

An den OnIdle-Event deiner Anwendung kommst du so :
In der Komponentenliste gibts unter "Zusätzlich" die Komponente "ApplicationEvents". Setz die auf deine Form, und wechsle in die Ereignisliste dieser Komponente.Dort findest du dann auch den "OnIdle"-Event!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 15:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
Ich habe fast das Gefühl das Problem liegt woanders. Es ist egal welche Taste ich drücke, ob cursor oder die "F"-Taste zB. Obwohl die ja völlig belanglos für das zeichnen ist....

hmpf, warum kann das nicht einfach gehn...

Howard (danke für deine Mühe SoS :) )

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Zitat:
Ich habe fast das Gefühl das Problem liegt woanders. Es ist egal welche Taste ich drücke, ob cursor oder die "F"-Taste zB. Obwohl die ja völlig belanglos für das zeichnen ist....

Hast du SoS's Methode ausprobiert? Dann dürfte ein Tastendruck keine Darstellungsfehler verursachen. Apropos: Immer wenn ich "Alt" drücke und eins meiner OpenGL-Proggs läuft bleibt es beinahe stehen. Nach einm erneuten Druck auf "Alt" geht es wieder schnell.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
Hab ich probiert ja:
Code:
  1.  unit test_u1;
  2.  
  3.  
  4.  
  5. interface
  6.  
  7.  
  8.  
  9. uses
  10.  
  11.  &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.  
  13.  &nbsp;Dialogs,opengl, AppEvnts;
  14.  
  15.  
  16.  
  17. type
  18.  
  19.  &nbsp;TForm1 = class(TForm)
  20.  
  21.  &nbsp; &nbsp;ApplicationEvents1: TApplicationEvents;
  22.  
  23.  &nbsp; &nbsp;procedure FormCreate(Sender: TObject);
  24.  
  25.  &nbsp; &nbsp;procedure FormDestroy(Sender: TObject);
  26.  
  27.  &nbsp; &nbsp;procedure FormKeyDown(Sender: TObject; var Key: Word;
  28.  
  29.  &nbsp; &nbsp; &nbsp;Shift: TShiftState);
  30.  
  31.  &nbsp; &nbsp;procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  32.  
  33.  &nbsp;
  34.  
  35.  &nbsp;private
  36.  
  37.  &nbsp; mydc : HDC;
  38.  
  39.  &nbsp; myrc : HGLRC;
  40.  
  41.  &nbsp; myPalette : HPALETTE;
  42.  
  43.  &nbsp; procedure SetupPixelFormat;
  44.  
  45.  
  46.  
  47.  &nbsp; &nbsp;{ Private-Deklarationen }
  48.  
  49.  &nbsp;public
  50.  
  51.  &nbsp; &nbsp;{ Public-Deklarationen }
  52.  
  53.  &nbsp;end;
  54.  
  55.  
  56.  
  57. var
  58.  
  59.  &nbsp;Form1: TForm1;
  60.  
  61.  &nbsp;rotx : integer;
  62.  
  63.  &nbsp;roty : integer;
  64.  
  65.  
  66.  
  67. implementation
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75. {$R *.dfm}
  76.  
  77. procedure Tform1.SetupPixelFormat;
  78.  
  79. var
  80.  
  81.  &nbsp;hheap : Thandle;
  82.  
  83.  &nbsp;ncolors,i : integer;
  84.  
  85.  &nbsp;lppalette : plogpalette;
  86.  
  87.  &nbsp;byredmask, bygreenmask, bybluemask : byte;
  88.  
  89.  &nbsp;npixelformat : integer;
  90.  
  91.  &nbsp;pfd : Tpixelformatdescriptor;
  92.  
  93. begin
  94.  
  95.  &nbsp;Fillchar(pfd,sizeof(pfd),0);
  96.  
  97.  &nbsp;with pfd do
  98.  
  99.  &nbsp;begin
  100.  
  101.  &nbsp; &nbsp;nsize := sizeof(pfd);
  102.  
  103.  &nbsp; &nbsp;nversion := 1;
  104.  
  105.  &nbsp; &nbsp;dwflags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or &nbsp; PFD_DOUBLEBUFFER;
  106.  
  107.  &nbsp; &nbsp;ipixeltype := PFD_TYPE_RGBA;
  108.  
  109.  &nbsp; &nbsp;cColorbits := 24;
  110.  
  111.  &nbsp; &nbsp;cdepthbits := 32;
  112.  
  113.  &nbsp; &nbsp;ilayertype := PFD_Main_Plane;
  114.  
  115.  &nbsp;end;
  116.  
  117.  &nbsp;nPixelFormat:= ChoosePixelFormat(myDC, @pfd);
  118.  
  119.  &nbsp;SetPixelFormat(myDC, nPixelFormat, @pfd);
  120.  
  121.  &nbsp;DescribePixelFormat(myDC, nPixelFormat,sizeof(TPixelFormatDescriptor),pfd);
  122.  
  123.  &nbsp;if ((pfd.dwFlags and PFD_NEED_PALETTE) <> 0) then
  124.  
  125.  &nbsp;begin
  126.  
  127.  &nbsp; &nbsp;nColors := 1 shl pfd.cColorBits;
  128.  
  129.  &nbsp; &nbsp;hHeap := GetProcessHeap;
  130.  
  131.  &nbsp; &nbsp;lpPalette:= HeapAlloc (hHeap,0,sizeof(TLogPalette)+(nColors*sizeof(TPaletteEntry)));
  132.  
  133.  &nbsp; &nbsp;lpPalette^.palVersion := $300;
  134.  
  135.  &nbsp; &nbsp;lpPalette^.palNumEntries := nColors;
  136.  
  137.  &nbsp; &nbsp;byRedMask := (1 shl pfd.cRedBits) - 1;
  138.  
  139.  &nbsp; &nbsp;byGreenMask:= (1 shl pfd.cGreenBits) - 1;
  140.  
  141.  &nbsp; &nbsp;byBlueMask := (1 shl pfd.cBlueBits) - 1;
  142.  
  143.  &nbsp; &nbsp;for i := 0 to nColors - 1 do begin
  144.  
  145.  &nbsp; &nbsp;lpPalette^.palPalEntry[i].peRed := (((i shr pfd.cRedShift) and byRedMask) *255)DIV &nbsp; byRedMask;
  146.  
  147.  &nbsp; &nbsp;lpPalette^.palPalEntry[i].peGreen:= (((i shr pfd.cGreenShift)and byGreenMask)*255)DIV byGreenMask;
  148.  
  149.  &nbsp; &nbsp;lpPalette^.palPalEntry[i].peBlue := (((i shr pfd.cBlueShift) and byBlueMask) *255)DIV byBlueMask;
  150.  
  151.  &nbsp; &nbsp;lpPalette^.palPalEntry[i].peFlags:= 0;
  152.  
  153.  &nbsp;end;
  154.  
  155.  &nbsp;myPalette:= CreatePalette(lpPalette^);
  156.  
  157.  &nbsp;HeapFree(hHeap, 0, lpPalette);
  158.  
  159.  &nbsp;if (myPalette <> 0) then
  160.  
  161.  &nbsp;begin
  162.  
  163.  &nbsp; &nbsp;SelectPalette(myDC, myPalette, False);
  164.  
  165.  &nbsp; &nbsp;RealizePalette(myDC);
  166.  
  167.  &nbsp;end;
  168.  
  169. end;end;
  170.  
  171.  
  172.  
  173. procedure Objekt;
  174.  
  175. begin
  176.  
  177.  &nbsp;glClearColor(0, 0, 0.0, 1); // HintergundFarbe
  178.  
  179.  &nbsp;glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
  180.  
  181.  &nbsp;glMatrixMode(GL_PROJECTION); // Darstellungsmodus = Projektionsmodus
  182.  
  183.  &nbsp;glLoadIdentity;
  184.  
  185.  &nbsp;glPolygonMode(GL_FRONT, GL_FILL); // Nur Vorderseiten darstellen (schneller) / Füllmodus : gefüllte Objekte
  186.  
  187.  &nbsp;glMatrixMode(GL_MODELVIEW); // Koordinatensystem drehen
  188.  
  189.  &nbsp;glLoadIdentity; // Setzt alles zurück auf Uhrsprungspunkt(sehr wichtig!)-ansonsten wird die Scene irgendwo dargestellt, aber nicht da, wo sie hin soll
  190.  
  191.  &nbsp;glPushmatrix();
  192.  
  193.  &nbsp;glcolor3f(1,1,0);
  194.  
  195.  &nbsp;glrotate(rotx,1,0,0);
  196.  
  197.  &nbsp;glrotate(roty,0,1,0);
  198.  
  199.  &nbsp;glBegin(GL_QUADS); //dieser Befehl zeichnet einen Würfel.
  200.  
  201.  
  202.  
  203.  &nbsp;glVertex3d(0.5, -0.5, 0.5); //Linke Seite
  204.  
  205.  &nbsp;glVertex3d(-0.5, -0.5, 0.5);
  206.  
  207.  &nbsp;glVertex3d(-0.5, -0.5, -0.5);
  208.  
  209.  &nbsp;glVertex3d(0.5, -0.5, -0.5);
  210.  
  211.  
  212.  
  213.  &nbsp;glVertex3d(-0.5, -0.5, -0.5); //Rückseite
  214.  
  215.  &nbsp;glVertex3d(-0.5, 0.5, -0.5);
  216.  
  217.  &nbsp;glVertex3d(0.5, 0.5, -0.5);
  218.  
  219.  &nbsp;glVertex3d(0.5, -0.5, -0.5);
  220.  
  221.  
  222.  
  223.  &nbsp;glVertex3d(0.5, -0.5, -0.5); //Oberseite
  224.  
  225.  &nbsp;glVertex3d(0.5, 0.5, -0.5);
  226.  
  227.  &nbsp;glVertex3d(0.5, 0.5, 0.5);
  228.  
  229.  &nbsp;glVertex3d(0.5, -0.5, 0.5);
  230.  
  231.  
  232.  
  233.  &nbsp;glVertex3d(-0.5, -0.5, 0.5); //Vorderseite
  234.  
  235.  &nbsp;glVertex3d(-0.5, 0.5, 0.5);
  236.  
  237.  &nbsp;glVertex3d(0.5, 0.5, 0.5);
  238.  
  239.  &nbsp;glVertex3d(0.5, -0.5, 0.5);
  240.  
  241.  
  242.  
  243.  &nbsp;glVertex3d(-0.5, -0.5, 0.5); //Boden / Unterseite
  244.  
  245.  &nbsp;glVertex3d(-0.5, 0.5, 0.5);
  246.  
  247.  &nbsp;glVertex3d(-0.5, 0.5, -0.5);
  248.  
  249.  &nbsp;glVertex3d(-0.5, -0.5, -0.5);
  250.  
  251.  
  252.  
  253.  &nbsp;glVertex3d(-0.5, 0.5, 0.5); //Rechte Seite
  254.  
  255.  &nbsp;glVertex3d(0.5, 0.5, 0.5);
  256.  
  257.  &nbsp;glVertex3d(0.5, 0.5, -0.5);
  258.  
  259.  &nbsp;glVertex3d(-0.5, 0.5, -0.5);
  260.  
  261.  &nbsp;glEnd();
  262.  
  263.  &nbsp;SwapBuffers(form1.myDC); //scene darstellen
  264.  
  265. end;
  266.  
  267.  
  268.  
  269. procedure TForm1.FormCreate(Sender: TObject);
  270.  
  271. begin
  272.  
  273.  &nbsp;form1.myDC:= GetDC(Handle);
  274.  
  275.  &nbsp;SetupPixelFormat;
  276.  
  277.  &nbsp;myRC:= wglCreateContext(myDC);
  278.  
  279.  &nbsp;wglMakeCurrent(myDC, myRC);
  280.  
  281.  &nbsp;glEnable(GL_DEPTH_TEST);
  282.  
  283.  &nbsp;glLoadIdentity;
  284.  
  285. end;
  286.  
  287.  
  288.  
  289. procedure TForm1.FormDestroy(Sender: TObject);
  290.  
  291. begin
  292.  
  293.  &nbsp;wglmakecurrent(0,0);
  294.  
  295.  &nbsp;wgldeletecontext(mydc);
  296.  
  297.  &nbsp;releasedc(handle,mydc);
  298.  
  299. end;
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  318.  
  319.  &nbsp;Shift: TShiftState);
  320.  
  321. begin
  322.  
  323.  &nbsp;if key = vk_down then
  324.  
  325.  &nbsp;begin
  326.  
  327.  &nbsp; &nbsp;rotx := rotx+1;
  328.  
  329.  &nbsp;end;
  330.  
  331.  
  332.  
  333.  &nbsp;if key = vk_up then
  334.  
  335.  &nbsp;begin
  336.  
  337.  &nbsp; &nbsp;rotx := rotx-1;
  338.  
  339.  &nbsp;end;
  340.  
  341.  
  342.  
  343.  &nbsp;if key = vk_right then
  344.  
  345.  &nbsp;begin
  346.  
  347.  &nbsp; &nbsp;roty := roty+1;
  348.  
  349.  &nbsp;end;
  350.  
  351.  
  352.  
  353.  &nbsp;if key = vk_left then
  354.  
  355.  &nbsp;begin
  356.  
  357.  &nbsp; &nbsp;roty := roty-1;
  358.  
  359.  &nbsp;end;
  360.  
  361.  &nbsp;repaint;
  362.  
  363. end;
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373. procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  374.  
  375.  &nbsp;var Done: Boolean);
  376.  
  377. begin
  378.  
  379. objekt;
  380.  
  381. Done := False; &nbsp; // Wichtig!!!
  382.  
  383. end;
  384.  
  385.  
  386.  
  387. end.
  388.  
  389.  


klappt leider nich :(


Gruß Howard

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Also das mit dem OnIdle-Event würde ich auf jeden Fall machen.Das ist halt die beste Methode um seine Szene (zumindest in einer VCL-Anwendung) zu zeichnen.

Hab auch mal kurz deinen Quellcode überflogen, und dabei ist mir folgendes aufgefallen :
Code:
  1.  
  2.  
  3. cColorbits := 24;
  4.  
  5. cdepthbits := 32;
  6.  
  7.  


Du wirst wohl kaum ne Grafikkarten finden, die dir dieses PixelFormat anbiete.Im Normalfall sucht sich die Grafikkarte dann das nächste passende PixelFormat, aber z.B. aufgrund eines Bugs in neueren nVidia-Treibern kommts vor, das die Grafikkarte ein falsches Format findet.
Nach deiner Definition oben, sollte z.B. eine GeForce-Karte dir anstatt Farbpuffer=24 und Tiefenpuffer=32 ein Format mit Farbpuffer=16 und Tiefenpuffer=16 liefern, und das ist nicht sehr erstrebenswert...ich glaub zwar nicht das hier dein Problem liegt (kenne deine Graka ja net), aber änder das mal in folgenden Code um

Code:
  1.  
  2.  
  3. cColorbits := 32;
  4.  
  5. cdepthbits := 24;
  6.  
  7.  


P.S. : GeForce-Karten unterstützen maximal einen 24bittigen Tiefenpuffer (hat was mit der Kombination des Tiefenpuffer und des Stencilpuffers zu einem DWORD = 32Bit zu tun)

P.P.S. : Lad mal dein Programm irgendwo (am besten DGL-FTP) hoch, dann werd ich mirs mal ansehen!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hallo!

Du musst noch in dem OnKeyDown das
Code:
  1. repaint;
am Ende wegnehmen, denn dein Fenster muss dann ja nicht neugezeichnet werden, sondern dein Objekt. Und das wird ja ständig im OnIdle erledigt.

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 07, 2003 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 02, 2003 13:38
Beiträge: 104
Wohnort: Bremen
kross, vielen dank thunder, das haut hin :)

ich hab mal spasseshalber das repaint; in die onidle funktion geschrieben...da kriegste Augenkrebs vom flimmern :D

_________________
------------------------------------------------------- <br>Wer andern eine Brawurst brät, <br>hat ein Bratwurst Bratgerät...... <br> <br>So long, Howard ^^ <br>-------------------------------------------------------


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]