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

Aktuelle Zeit: So Sep 07, 2025 16:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 22, 2003 23:22
Beiträge: 10
Hi Board! :D

Ich hab soeben versucht die Heightmap aus dem Tutorial Heightmaps1 zu basteln. Ich habe eben nocheinmal den Code durchgesehen, aber keinen Fehler entdeckt... Rsultat: ich sehe keine Heightmap? Wird sie etwa gar nicht geladen? Die entsprechende Bmp liegt im richtigen Verzeichnis.

So und jetz wieder des Proggi :rolleyes:

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, OpenGL12, Geometry, AppEvnts, Textures;
  9.  
  10. const
  11.   FarClipping   = 5000.0;
  12.   NearClipping  = 1.0;
  13.   MapSize = 2048;
  14.   MapResolution = 86;
  15.  
  16. type
  17.   TMapDaten = Array[0..MapResolution, 0..MapResolution] of Byte;
  18.  
  19.   TForm1 = class(TForm)
  20.     procedure FormCreate(Sender: TObject);
  21.     procedure FormShow(Sender: TObject);
  22.     procedure FormDestroy(Sender: TObject);
  23.     procedure FormResize(Sender: TObject);
  24.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  25.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  26.       Shift: TShiftState; X, Y: Integer);
  27.     procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
  28.       Shift: TShiftState; X, Y: Integer);
  29.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  30.       Shift: TShiftState);
  31.     procedure FormKeyUp(Sender: TObject; var Key: Word;
  32.       Shift: TShiftState);
  33.     procedure CheckKeys;
  34.   private
  35.     OpenGLInitialized : Boolean;
  36.     RC : HGLRC;         //OpenGL Rendering Context
  37.     SkyBoxTexturen : Array[0..5] of TGlUInt;
  38.     StartTick : Cardinal;
  39.     Frames : LongInt;
  40.     XRotation, YRotation : Single;
  41.     MouseX, MouseY : LongInt;
  42.     MapDaten : TMapDaten;
  43.     { Private-Deklarationen }
  44.   public
  45.     { Public-Deklarationen }
  46.   end;
  47.  
  48. var
  49.   Form1: TForm1;
  50.   Keys: Array[0..255] of Boolean;
  51.   Rotate,RotateX,PosX,PosY,PosZ,CamX,CamY: Single;
  52.  
  53. implementation
  54.  
  55. {$R *.dfm}
  56.  
  57. procedure TForm1.CheckKeys;
  58. begin
  59.   if Keys[VK_LEFT] then begin
  60.     Rotate:=Rotate - 2 * (100 / 20);
  61.     if Rotate<0 then
  62.       Rotate:=Rotate + 360;
  63.   end;
  64.   if Keys[VK_RIGHT] then begin
  65.     Rotate:=Rotate + 2 * (100 / 20);
  66.     if Rotate>360 then
  67.       Rotate:=Rotate - 360;
  68.   end;
  69.   if Keys[VK_UP] then begin
  70.     PosX:=PosX + Sin(-Rotate * (PI / 180)) * (0.1);
  71.     PosZ:=PosZ + Cos(-Rotate * (PI / 180)) * (0.1);
  72.   end;
  73.   if Keys[VK_DOWN] then begin
  74.     PosX:=PosX - Sin(-Rotate * (PI / 180)) * (0.1);
  75.     PosZ:=PosZ - Cos(-Rotate * (PI / 180)) * (0.1);
  76.   end;
  77. end;
  78.  
  79. procedure TForm1.FormCreate(Sender: TObject);
  80. begin
  81.   //OpenGL ist noch nicht bereit
  82.   OpenGLInitialized := False;
  83.   //Kontrolle ob die Bilbliiotheken geladen sind
  84.   if not LoadOpenGL then
  85.     Halt(100);
  86. Application.OnIdle := ApplicationEventsIdle;
  87.  
  88. end;
  89.  
  90. procedure TForm1.FormShow(Sender: TObject);
  91.   procedure SetPixelFormat;
  92.   var
  93.     PixelFormat      : TGLuint;
  94.     PFD              : pixelformatdescriptor;
  95.   begin
  96.     with pfd do
  97.       begin
  98.         nSize:= SizeOf( PIXELFORMATDESCRIPTOR );
  99.         nVersion:= 1;
  100.         dwFlags:= PFD_DRAW_TO_WINDOW
  101.           or PFD_SUPPORT_OPENGL
  102.           or PFD_DOUBLEBUFFER;
  103.         iPixelType:= PFD_TYPE_RGBA;
  104.         cColorBits:= 16;
  105.         cRedBits:= 0;
  106.         cRedShift:= 0;
  107.         cGreenBits:= 0;
  108.         cBlueBits:= 0;
  109.         cBlueShift:= 0;
  110.         cAlphaBits:= 0;
  111.         cAlphaShift:= 0;
  112.         cAccumBits:= 0;
  113.         cAccumRedBits:= 0;
  114.         cAccumGreenBits:= 0;
  115.         cAccumBlueBits:= 0;
  116.         cAccumAlphaBits:= 0;
  117.         cDepthBits:= 16;
  118.         cStencilBits:= 0;
  119.         cAuxBuffers:= 0;
  120.         iLayerType:= PFD_MAIN_PLANE;
  121.         bReserved:= 0;
  122.         dwLayerMask:= 0;
  123.         dwVisibleMask:= 0;
  124.         dwDamageMask:= 0
  125.       end;
  126.     PixelFormat := ChoosePixelFormat(Canvas.Handle, @pfd);
  127.     if (PixelFormat=0) then
  128.       MessageDlg('Can''t find a suitable PixelFormat.', mtError, [mbOk], 0);
  129.     if (not Windows.SetPixelFormat(Canvas.Handle,PixelFormat,@pfd)) then
  130.       MessageDlg('Can''t set PixelFormat.', mtError, [mbOk], 0)
  131.   end;
  132.  
  133.   procedure StartGl;
  134.   begin
  135.     RC := wglCreateContext(Canvas.Handle);
  136.     if (RC=0) then
  137.     begin
  138.       MessageDlg('Can''t create RC', mtError, [mbOk], 0);
  139.       Halt(100)
  140.     end;
  141.  
  142.     if (not wglMakeCurrent(Canvas.Handle, RC)) then
  143.     begin
  144.       MessageDlg('Can''t activate RC', mtError, [mbOk], 0);
  145.       Halt(100)
  146.     end
  147.   end;
  148.  
  149.   procedure SetupGL;
  150.   const
  151.     light_position : array[0..3] of TGLfloat = (-1.0, 1.0, 1.0, 0.0);
  152.     mat_specular  : array[0..3] of TGLfloat = (0.1, 0.1, 0.1, 1.0);
  153.     mat_shininess : array[0..0] of TGLfloat = (0.0);
  154.  
  155.     mat_ambient : array[0..3] of TGLfloat = (0.7, 0.7, 0.7, 0.0);
  156.     mat_diffuse : array[0..3] of TGLfloat = (0.8, 0.8, 0.8, 0.0);
  157.  
  158.   begin
  159.     glClearColor(0.0, 0.0, 0.0, 0.0); //Hintergrundfarbe
  160.     glEnable(GL_DEPTH_TEST);
  161.     glEnable(gl_Cull_Face);
  162.  
  163.     glEnable(GL_TEXTURE_2D);
  164.     glShadeModel(GL_SMOOTH);
  165.  
  166.     glMaterialfv(GL_FRONT, GL_SPECULAR, @mat_specular[0]);
  167.     glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  168.     glMaterialfv(GL_FRONT, GL_AMBIENT, @mat_ambient[0]);
  169.     glMaterialfv(GL_FRONT, GL_DIFFUSE, @mat_diffuse[0]);
  170.  
  171.     glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  172.     glEnable(GL_LIGHTING);
  173.     glEnable(GL_LIGHT0)
  174.   end;
  175.  
  176.   procedure LoadTextures;
  177.   const
  178.     SkyTexturesName : Array[0..5] of String = ('north.jpg', 'east.jpg', 'south.jpg',
  179.       'west.jpg', 'top.jpg', 'bottom.jpg');
  180.   var
  181.     I : Integer;
  182.   begin
  183.     //Bilder für SkyBox laden
  184.     for I := 0 to 5 do
  185.       LoadTexture(SkyTexturesName[I], SkyBoxTexturen[I], False);
  186.   end;
  187.  
  188.   procedure LoadHeightMap;
  189.   var
  190.     Bmp : TBitMap;
  191.     X,Z : LongInt;
  192.   begin
  193.     Bmp := TBitMap.Create;
  194.     try
  195.       Bmp.LoadFromFile('YU14H.bmp');
  196.       //Bitmap in MapDaten laden...
  197.       for X := 0 to MapResolution do
  198.         for Z := 0 to MapResolution do
  199.           MapDaten[X,Z] := Trunc(Bmp.Canvas.Pixels[Trunc(X/MapResolution*Bmp.Width),
  200.                              Trunc(Z/MapResolution*Bmp.Height)] / clWhite * 255)
  201.     except
  202.       MessageDlg('Fehler beim laden der Heightmap', mtError, [mbOk], 0)
  203.     end;
  204.     Bmp.Free
  205.   end;
  206.  
  207. begin
  208.   RC := 0;
  209.  
  210.   SetPixelFormat;
  211.   StartGL;
  212.  
  213.   //Extensions auslesen
  214.   ClearExtensions;
  215.   ReadExtensions;
  216.  
  217.   //GLStatus Variablen einstellen
  218.   SetupGL;
  219.   LoadTextures;
  220.  
  221.   Frames := 0;
  222.   StartTick := GetTickCount;
  223.  
  224.   OpenGLInitialized := True
  225. end;
  226.  
  227. procedure TForm1.FormDestroy(Sender: TObject);
  228. begin
  229.   OpenGLInitialized := False;
  230.   if RC<>0 then
  231.     begin
  232.       if (not wglMakeCurrent(Canvas.Handle,0)) then
  233.         MessageBox(0,'Release of DC and RC failed.',' Shutdown Error',MB_OK or MB_ICONERROR);
  234.       if (not wglDeleteContext(RC)) then
  235.         begin
  236.           MessageBox(0,'Release of Rendering Context failed.',' Shutdown Error',MB_OK or MB_ICONERROR);
  237.         end
  238.     end;
  239.   RC:=0
  240. end;
  241.  
  242. procedure TForm1.FormResize(Sender: TObject);
  243. begin
  244.   glViewport(0, 0, ClientWidth, ClientHeight);
  245.   glMatrixMode(GL_PROJECTION);
  246.   glLoadIdentity();
  247.   gluPerspective(60.0,ClientWidth/ClientHeight,NearClipping,FarClipping);
  248.   // hier wird das Verhätlnis zwischen errechnet Höhe und Breite der Oberfläche errechnet.
  249.   glMatrixMode(GL_MODELVIEW);
  250.   glLoadIdentity
  251. end;
  252.  
  253. procedure TForm1.ApplicationEventsIdle(Sender: TObject;
  254.   var Done: Boolean);
  255. var
  256.   Triangles : LongInt;
  257.  
  258.   procedure PaintSkyBox;
  259.   const
  260.     QuadPosition : Array[0..5] of Array[0..3] of Array[0..2] of Single =
  261.       (((2.005,2.005,-1.995),(2.005,-2.005,-1.995),(-2.005,-2.005,-1.995),(-2.005,2.005,-1.995)),     //Nordseite
  262.        ((1.995,2.005,2),(1.995,-2.005,2),(1.995,-2.005,-2),(1.995,2.005,-2)),         //Ostseite
  263.        ((-2.005,2.005,1.995),(-2.005,-2.005, 1.995),(2.005,-2.005,1.995),(2.005,2.005,1.995)),          //Südseite
  264.        ((-1.995,2.005,-2),(-1.995,-2.005,-2),(-1.995,-2.005,2),(-1.995,2.005,2)),      //Westseite
  265.        ((-2,2,-2),(-2,2,2),(2,2,2), (2,2,-2)),
  266.        ((2,-2,-2),(2,-2,2),(-2,-2,2),(-2,-2,-2)));
  267.     TexturePos : Array[0..3] of Array[0..1] of Single =
  268.       ((1,1),(1,0),(0, 0),(0, 1));
  269.   var
  270.     Side, Vertex : Integer;
  271.   begin
  272.     for Side := 0 to 5 do
  273.     begin
  274.       //Textur aktivieren
  275.       glBindTexture(GL_TEXTURE_2D, SkyBoxTexturen[Side]);
  276.       glBegin(GL_QUADS);
  277.       //Vertieces und Tex Coords übergeben
  278.       for Vertex := 3 downto 0 do
  279.       begin
  280.         glTexCoord2fv(@TexturePos[Vertex][0]);
  281.         glVertex3fv(@QuadPosition[Side][Vertex][0])
  282.       end;
  283.       glEnd()
  284.     end
  285.   end;
  286.  
  287.   procedure PaintHeightMap;
  288.   const
  289.     VertPos : Array[0..3] of Array[0..1] of Byte =
  290.       ((0,0),(0,1),(1,1),(1,0));
  291.   var
  292.     X,Z,I : LongInt;
  293.     Vertieces : Array[0..3] of TVertex;
  294.  
  295.     procedure PaintTriangle(V1, V2, V3 : Integer);
  296.     var
  297.       Normale : TVertex;
  298.     begin
  299.       Inc(Triangles);
  300.       Normale := VectorCrossProduct(VectorSubtract(Vertieces[V1], Vertieces[V2]),
  301.                  VectorSubtract(Vertieces[V2], Vertieces[V3]));
  302.       NormalizeVector(Normale);
  303.       glNormal3fv(@Normale[0]);
  304.       glBegin(GL_TRIANGLES);
  305.         glVertex3fv(@Vertieces[V1][0]);
  306.         glVertex3fv(@Vertieces[V2][0]);
  307.         glVertex3fv(@Vertieces[V3][0]);
  308.       glEnd()
  309.     end; (*PaintTriangle*)
  310.  
  311.   begin
  312.     for X := 0 to MapResolution - 1 do
  313.       for Z := 0 to MapResolution - 1 do
  314.       begin
  315.         //Alle Vertieces erzeugen
  316.         for I := 0 to 3 do
  317.         begin
  318.           Vertieces[I][0] := (X + VertPos[I][0])/MapResolution*MapSize;
  319.           Vertieces[I][2] := (Z + VertPos[I][1])/MapResolution*MapSize;
  320.           Vertieces[I][1] := MapDaten[X + VertPos[I][0],Z + VertPos[I][1]]
  321.         end;
  322.         PaintTriangle(0,1,3);
  323.         PaintTriangle(1,2,3)
  324.       end
  325.   end; (*PaintHeightMap*)
  326.  
  327. var
  328.   Error : LongInt;
  329. begin
  330.   Done := True;
  331.   if not OpenGLInitialized then Exit;
  332.   Done := False;
  333.   Triangles := 0;
  334.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  335.   glLoadIdentity;
  336.   glRotatef(XRotation, 1, 0,0);
  337.   glRotatef(YRotation, 0, 1,0);
  338.  
  339.   CheckKeys;
  340.   glTranslatef(PosX,PosY,PosZ);
  341.   glRotatef(Rotate,0,1,0);
  342.  
  343.   glPushAttrib(GL_LIGHTING);
  344.     glDisable(GL_LIGHTING);
  345.     PaintSkyBox;
  346.   glPopAttrib();
  347.   glClear(GL_DEPTH_BUFFER_BIT);
  348.  
  349.   glTranslatef(-(MapSize div 2), -200, -(MapSize div 2));
  350.   PaintHeightMap;
  351.   //Error Handler
  352.   Error := glgetError;
  353.   if Error <> GL_NO_ERROR then
  354.   begin
  355.     MessageBeep(65535);
  356.     Caption := gluErrorString(Error)
  357.   end;
  358.   //Frame Counter
  359.   Inc(Frames);
  360.   if GetTickCount - StartTick >=1000 then
  361.   begin
  362.     Caption := Format('Sky Box Demo FPS: %f Triangles: %d', [Frames/(GetTickCount - StartTick)*1000,
  363.                  Triangles]);
  364.     Frames := 0;
  365.     StartTick := GetTickCount
  366.   end;
  367.   SwapBuffers(Canvas.Handle)
  368.  
  369. end;
  370.  
  371. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  372.   Shift: TShiftState; X, Y: Integer);
  373. begin
  374.   MouseCapture := True;
  375.   MouseX := X;
  376.   MouseY := Y;
  377.  
  378. end;
  379.  
  380. procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  381.   Shift: TShiftState; X, Y: Integer);
  382. begin
  383.   MouseCapture := False
  384. end;
  385.  
  386. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  387.   Shift: TShiftState);
  388. begin
  389. Keys[Key] := true;
  390. end;
  391.  
  392. procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  393.   Shift: TShiftState);
  394. begin
  395. Keys[Key] := false;
  396. end;
  397.  
  398. end.
  399.  


... sieht wahrscheinlich mehr aus, als es ist. *lol

Was mir aufgefallen ist: ich habe in meinem Prog so um die 3 FPS .... (450Mhz PIII bei 256 MB SD-Ram ... ich bin auf jegliches Gelächter vorbereitet ;) ) ... wenn ich aber die Heightmap, die dem Tut beigelegt ist starte kriege ich so gegen 14 FPS ...

Wo kann der Fehler nur liegen?
Kann mir jemand den Gefallen tun und den Code bei sich testen oder vielleicht nach ungereimtheiten durchforsten?

Besten Dank an jeden Kniffler! B)

greetz
//me


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 23:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 22, 2003 23:22
Beiträge: 10
ohje... ich habe gerade das ... gelesen:

<!--QuoteBeginPOKEMON--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE </td></tr><tr><td id='QUOTE'><!--QuoteEBegin-->
Bedenkt allerdings auch, dass wir von Euch einen gewissen Einsatz erwarten! Es wird daher ungerne gesehen, langen Source Code zu sehen mit der Frage "Es geht etwas nicht, helft mir suchen!". Zum einen Erwarten wir, dass langer Code hochgeladen wird, damit die Posts nicht unübersichtlich werden, zum anderen, dass Ihr das problem so beschreibt, dass auch die Helfenden etwas damit anfangen können. Und wer nicht in der Lage ist das Problem soweit zu lokalisieren, der sollte sich erstmal mit anderen Grundlagen befassen ;)
[/quote]

Ich muss da 'mal behaupten, dass ich den obigen Code Zeile für Zeile durchgearbeitet habe um ihn zu verstehen. Einige Sachen - wie PaintTriangle - sind mir dabei noch nicht so geläufig, aber ich kann einfach nichts entdecken, da ich als letzte Methode einfach immer versuche, dass original so gut es mir geht abzutippen bzw. zu kopieren.

Wenn ich wüsste an welcher Stelle ich den Fehler gemacht habe, dann würde ich ja nur diesen Teil hier 'reinstellen, aber es funzt einfach nicht, da das Tut so beschreibungsmäßig ziemlich dürftig war und man sich den Quellcode grob selbst herleiten muss.

Worauf ich hinaus will, ist 'n bisschen Verständnis und 'mal jemand von den Profis für mich 'ne Ausnahme macht und 'nen Blick auf den Code wirft.

Zum Problem zurück - vielleicht ist der Fehler dann schneller aufzufinden...

so sieht mein Screen aus, wenn ich das Proggi starte:

Bild

Das graue da unten müsste mein Gebirge sein ;) ... hat jemand 'ne Ahnung wo im code ich anfangen sollte? Die markanten Bereiche sind für mich das Laden des Images, die zuordnung der einzelnen Abschnitte zu den Triangles und das Rendering. Aber ich raffs nicht - in keinem der BEreiche ist was faul! Im OnIdle sind auch alle Prozeduren aufgerufen worden. Außerdem werden offensichtlich ber 14000 Triangles gezeichnet.
Bin ich etwa blind?

greetz
//me


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
ich weiß gar net, was du hast...
deine Heightmap ist doch da...;) aber ohne Licht sieht die halt etwas eintönig aus...

füge mal vor paintheightmap im applicationeventsidle ein
Code:
  1. glenable(gl_LIGHTING);

ein...
dann sollte es klappen, falls ich nicht irgendwas übersehen habe...

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 25, 2003 23:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jan 04, 2003 21:23
Beiträge: 674
Wohnort: Köln
aber eigentlich werden die Lighting attribute ja wieder richtig gesetzt... (*weitersucht*)
;)

_________________
. . .


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.008s | 14 Queries | GZIP : On ]