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

Aktuelle Zeit: Fr Jul 18, 2025 21:08

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 10:25 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
nein, wenn ich das licht vor dem aufruf der kamera translation setze habe ich das licht immer auf kameraposition, was ich aber nicht möchte, denn das licht soll statisch in der szene stehen, was es eigentlich auch tut, aber eben dieser effekt stört mich, hier mal die komplette unit bzgl 3d aus meinem neuen projekt:

(das backface culling wurde aus versehen zum frontface culling, hatte net gemerkt, dass ich zu testzwecken auf front gestellt habe ^^)
Code:
  1.  
  2. unit UPreview;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, dglopengl, glbitmap, math, UFrustumCulling;
  9.  
  10. const
  11.   NearClipping = 1;
  12.   FarClipping  = 1000;
  13.  
  14. type
  15.   TVector3f = record
  16.     x, y, z: single;
  17.   end;
  18.   TFogColor = record
  19.     Red : single;
  20.     Green : single;
  21.     Blue : single;
  22.     Alpha : single;
  23.   end;
  24.   TPreview = class(TForm)
  25.     procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  26.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  27.     procedure FormCreate(Sender: TObject);
  28.     procedure FormDestroy(Sender: TObject);
  29.     procedure FormResize(Sender: TObject);
  30.   private
  31.     DC: HDC;
  32.     RC: HGLRC;
  33.     CalcTime,
  34.     Frequency: int64;
  35.     Timestep: single;
  36.     Frustum: TFrustum;
  37.     procedure CalcTimestep;
  38.     procedure SetupOpengl;
  39.     procedure UpdateLight;
  40.     procedure LoadTextures;
  41.     procedure DrawMap;
  42.     procedure Movement;
  43.     procedure IdleHandler(Sender: TObject; var Done: Boolean);
  44.   public
  45.     mpoly,
  46.     mtex,
  47.     mlight,
  48.     mfog,
  49.     mbfc,
  50.     mfc: boolean;
  51.     procedure DoScreenshot;
  52.   end;
  53.  
  54. const
  55.   movespeed = 5;
  56.   rotspeed = 90;
  57.   tilesize = 2;
  58.  
  59. var
  60.   Preview: TPreview;
  61.   // Path
  62.   programpath: string;
  63.   // Tex
  64.   floortex,
  65.   walltex: gluint;
  66.   // Cam
  67.   cpos,
  68.   crot: TVector3f;
  69.   // Control
  70.   // Move
  71.   kmforward,
  72.   kmbackward,
  73.   kmleft,
  74.   kmright,
  75.   kmup,
  76.   kmdown: boolean;
  77.   // Look
  78.   kleft,
  79.   kright,
  80.   kup,
  81.   kdown: boolean;
  82.  
  83. const
  84.   mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  85.   mat_shininess  : Array[0..0] of GlFloat = (50.0);
  86.   mat_ambient    : Array[0..3] of GlFloat = (0.5, 0.5, 0.5, 1.0);
  87.   mat_diffuse    : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  88.  
  89.   light_position : Array[0..3] of GlFloat = (0, 5, 0, 1);
  90.   light_ambient  : Array[0..3] of GlFloat = (0.5, 0.5, 0.5, 1.0);
  91.   light_diffuse  : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  92.  
  93. implementation
  94.  
  95. uses UMain;
  96.  
  97. {$R *.dfm}
  98.  
  99. function to_v3f(x, y, z: single): TVector3f;
  100. begin
  101.   result.x := x;
  102.   result.y := y;
  103.   result.z := z;
  104. end;
  105.  
  106. function to_FogColor(color: TColor): TFogColor;
  107. begin
  108.   result.Red := getrvalue(colorToRgb(color)) / 255;
  109.   result.Green := getgvalue(colorToRgb(color)) / 255;
  110.   result.Blue := getbvalue(colorToRgb(color)) / 255;
  111.   result.Alpha := 0;
  112. end;
  113.  
  114. procedure TPreview.DoScreenshot;
  115. type
  116.  BITMAPFILEHEADER = packed record
  117.     bfType: Word;
  118.     bfSize: DWORD;
  119.     bfReserved1: Word;
  120.     bfReserved2: Word;
  121.     bfOffBits: DWORD;
  122.   end;
  123.  
  124.  BITMAPINFOHEADER = packed record
  125.     biSize: DWORD;
  126.     biWidth: Longint;
  127.     biHeight: Longint;
  128.     biPlanes: Word;
  129.     biBitCount: Word;
  130.     biCompression: DWORD;
  131.     biSizeImage: DWORD;
  132.     biXPelsPerMeter: Longint;
  133.     biYPelsPerMeter: Longint;
  134.     biClrUsed: DWORD;
  135.     biClrImportant: DWORD;
  136.   end;
  137.  var
  138.    f: file;
  139.    FileInfo: BITMAPINFOHEADER;
  140.    FileHeader: BITMAPFILEHEADER;
  141.    pPicData:Pointer;
  142.    Viewport: array[0..3] of integer;
  143.    path: string;
  144.    i: integer;
  145. begin
  146.   ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
  147.   ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
  148.  
  149.   glGetIntegerv(GL_VIEWPORT, @Viewport);
  150.  
  151.   //Header
  152.   FileHeader.bfType := 19778; //$4D42 = 'BM'
  153.   FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
  154.  
  155.   //FileInfo
  156.   FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
  157.   FileInfo.biWidth := Viewport[2];
  158.   FileInfo.biHeight := Viewport[3];
  159.   FileInfo.biPlanes := 1;
  160.   FileInfo.biBitCount := 32;
  161.   FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  162.   FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
  163.  
  164.   GetMem(pPicData, FileInfo.biSizeImage);
  165.   try
  166.     glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
  167.     //Dateiname
  168.     i := 0;
  169.     path := extractfilepath(paramstr(0));
  170.     while fileexists(path + 'screen_' + inttostr(i) + '.bmp') do
  171.       inc(i);
  172.     AssignFile(f, path + 'screen_' + inttostr(i) + '.bmp');
  173.     Rewrite(f, 1);
  174.     try
  175.       //Schreiben
  176.       BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
  177.       BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
  178.       BlockWrite(F, pPicData^, FileInfo.biSizeImage );
  179.     finally
  180.       //Schließen
  181.       CloseFile(f);
  182.     end;
  183.   finally
  184.     //Freigeben
  185.     FreeMem(pPicData, FileInfo.biSizeImage);
  186.   end;
  187. end;
  188.  
  189. procedure TPreview.LoadTextures;
  190. begin
  191.   loadTexture(programpath + 'tex\floor.jpg', floortex, false);
  192.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  193.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  194.  
  195.   loadTexture(programpath + 'tex\wall.jpg', walltex, false);
  196.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  197.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  198. end;
  199.  
  200. procedure TPreview.SetupOpengl;
  201. var
  202.   FogColor: TFogColor;
  203. begin
  204.   glClearColor(0, 0, 0, 0);
  205.  
  206.   glEnable(GL_DEPTH_TEST);
  207.   if mtex then
  208.     glEnable(GL_TEXTURE_2D) else
  209.       glDisable(GL_TEXTURE_2D);
  210.  
  211.   if mbfc then
  212.   begin
  213.     glEnable(GL_CULL_FACE);
  214.     glCullFace(GL_FRONT);
  215.   end else
  216.     glDisable(GL_CULL_FACE);
  217.  
  218.   if mfog then
  219.   begin
  220.     FogColor := to_FogColor(clwhite);
  221.     glFogf(GL_FOG_START, 0);
  222.     glFogf(GL_FOG_END, 50);
  223.     glFogfv(GL_FOG_COLOR, @FogColor);
  224.     glFogi(GL_FOG_MODE, GL_LINEAR);
  225.     glEnable(GL_FOG);
  226.   end else
  227.     glDisable(GL_FOG);
  228.  
  229.   if mpoly then
  230.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) else
  231.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  232. end;
  233.  
  234. procedure TPreview.UpdateLight;
  235. begin
  236.   if mlight then
  237.   begin
  238.     glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  239.     glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  240.     glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  241.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  242.  
  243.     glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  244.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  245.     glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  246.  
  247.     glEnable(GL_LIGHTING);
  248.     glEnable(GL_LIGHT0);
  249.   end else
  250.   begin
  251.     glDisable(GL_LIGHTING);
  252.     glDisable(GL_LIGHT0);
  253.   end;
  254. end;
  255.  
  256. procedure TPreview.CalcTimestep;
  257. var
  258.   CurrTime: int64;
  259. begin
  260.   QueryPerformanceCounter(CurrTime);
  261.   Timestep := (CurrTime - CalcTime) / Frequency;
  262.   CalcTime := CurrTime;
  263. end;
  264.  
  265. procedure TPreview.DrawMap;
  266. var
  267.   x, z: integer;
  268.   ddraw: boolean;
  269. begin
  270.   with MainForm do
  271.   begin
  272.     glPushmatrix;
  273.     glTranslatef(- msize * tilesize / 2, 0, - msize * tilesize / 2);
  274.  
  275.     Frustum.Calculate;
  276.     for x := 0 to msize - 1 do
  277.       for z := 0 to msize - 1 do
  278.         if Map[x, z] <> wall then
  279.         begin
  280.           ddraw := true;
  281.           if mfc then
  282.             ddraw := Frustum.IsBoxWithin(x * tilesize, 0, z * tilesize, tilesize, tilesize, tilesize);
  283.           if ddraw then
  284.           begin
  285.             glPushmatrix;
  286.               glTranslatef(x * tilesize, 0, z * tilesize);
  287.               glBindTexture(GL_TEXTURE_2D, floortex);
  288.               // DrawFloor
  289.               glNormal3f(0, 1, 0);
  290.               glBegin(GL_QUADS);
  291.                 glTexCoord2f(1, 0); glVertex3f( tilesize / 2, 0, -tilesize / 2);
  292.                 glTexCoord2f(1, 1); glVertex3f( tilesize / 2, 0,  tilesize / 2);
  293.                 glTexCoord2f(0, 1); glVertex3f(-tilesize / 2, 0,  tilesize / 2);
  294.                 glTexCoord2f(0, 0); glVertex3f(-tilesize / 2, 0, -tilesize / 2);
  295.               glEnd;
  296.               // Surrounding Walls
  297.               glPushMatrix;
  298.                 glTranslatef(0, tilesize / 2, 0);
  299.                 glBindTexture(GL_TEXTURE_2D, walltex);
  300.                 // LEFT
  301.                 if (x - 1) >= 0 then
  302.                   if Map[x - 1, z] = wall then
  303.                   begin
  304.                     glNormal3f(1, 0, 0);
  305.                     glBegin(GL_QUADS);
  306.                       glTexCoord2f(1, 1); glVertex3f(-tilesize / 2, -tilesize / 2, -tilesize / 2);
  307.                       glTexCoord2f(0, 1); glVertex3f(-tilesize / 2, -tilesize / 2,  tilesize / 2);
  308.                       glTexCoord2f(0, 0); glVertex3f(-tilesize / 2,  tilesize / 2,  tilesize / 2);
  309.                       glTexCoord2f(1, 0); glVertex3f(-tilesize / 2,  tilesize / 2, -tilesize / 2);
  310.                     glEnd;
  311.                   end;
  312.                 // RIGHT
  313.                 if (x + 1) <= msize - 1 then
  314.                   if Map[x + 1, z] = wall then
  315.                   begin
  316.                     glNormal3f(-1, 0, 0);
  317.                     glBegin(GL_QUADS);
  318.                       glTexCoord2f(0, 0); glVertex3f(tilesize / 2,  tilesize / 2, -tilesize / 2);
  319.                       glTexCoord2f(1, 0); glVertex3f(tilesize / 2,  tilesize / 2,  tilesize / 2);
  320.                       glTexCoord2f(1, 1); glVertex3f(tilesize / 2, -tilesize / 2,  tilesize / 2);
  321.                       glTexCoord2f(0, 1); glVertex3f(tilesize / 2, -tilesize / 2, -tilesize / 2);
  322.                     glEnd;
  323.                   end;
  324.                 // UP
  325.                 if (z - 1) >= 0 then
  326.                   if Map[x, z - 1] = wall then
  327.                   begin
  328.                     glNormal3f(0, 0, 1);
  329.                     glBegin(GL_QUADS);
  330.                       glTexCoord2f(0, 0); glVertex3f(-tilesize / 2,  tilesize / 2, -tilesize / 2);
  331.                       glTexCoord2f(1, 0); glVertex3f( tilesize / 2,  tilesize / 2, -tilesize / 2);
  332.                       glTexCoord2f(1, 1); glVertex3f( tilesize / 2, -tilesize / 2, -tilesize / 2);
  333.                       glTexCoord2f(0, 1); glVertex3f(-tilesize / 2, -tilesize / 2, -tilesize / 2);
  334.                     glEnd;
  335.                   end;
  336.                 // DOWN
  337.                 if (z + 1) <= msize - 1 then
  338.                   if Map[x, z + 1] = wall then
  339.                   begin
  340.                     glNormal3f(0, 0, -1);
  341.                     glBegin(GL_QUADS);
  342.                       glTexCoord2f(1, 1); glVertex3f(-tilesize / 2, -tilesize / 2, tilesize / 2);
  343.                       glTexCoord2f(0, 1); glVertex3f( tilesize / 2, -tilesize / 2, tilesize / 2);
  344.                       glTexCoord2f(0, 0); glVertex3f( tilesize / 2,  tilesize / 2, tilesize / 2);
  345.                       glTexCoord2f(1, 0); glVertex3f(-tilesize / 2,  tilesize / 2, tilesize / 2);
  346.                     glEnd;
  347.                   end;
  348.               glPopMatrix;
  349.             glPopMatrix;
  350.           end;  
  351.         end else
  352.         begin
  353.           ddraw := true;
  354.           if mfc then
  355.             ddraw := Frustum.IsBoxWithin(x * tilesize, 0, z * tilesize, tilesize, tilesize, tilesize);
  356.           if ddraw then
  357.           begin
  358.             glPushmatrix;
  359.               glTranslatef(x * tilesize, 0, z * tilesize);
  360.               glBindTexture(GL_TEXTURE_2D, floortex);
  361.               // DrawCeiling
  362.               glNormal3f(0, 1, 0);
  363.               glBegin(GL_QUADS);
  364.                 glTexCoord2f(1, 0); glVertex3f( tilesize / 2, tilesize, -tilesize / 2);
  365.                 glTexCoord2f(1, 1); glVertex3f( tilesize / 2, tilesize,  tilesize / 2);
  366.                 glTexCoord2f(0, 1); glVertex3f(-tilesize / 2, tilesize,  tilesize / 2);
  367.                 glTexCoord2f(0, 0); glVertex3f(-tilesize / 2, tilesize, -tilesize / 2);
  368.               glEnd;
  369.             glPopMatrix;
  370.           end;
  371.         end;
  372.     glPopmatrix;
  373.   end;
  374. end;
  375.  
  376. procedure TPreview.Movement;
  377. var
  378.   newspeed: single;
  379. begin
  380.   if kleft then
  381.     crot.y := crot.y - rotspeed * timestep;
  382.   if kright then
  383.     crot.y := crot.y + rotspeed * timestep;
  384.   if kup then
  385.     crot.x := crot.x - rotspeed * timestep;
  386.   if kdown then
  387.     crot.x := crot.x + rotspeed * timestep;
  388.            
  389.   if crot.y < 0 then
  390.     crot.y := crot.y + 360;
  391.   if crot.y > 360 then
  392.     crot.y := 360 - crot.y;
  393.   if crot.x < 0 then
  394.     crot.x := crot.x + 360;
  395.   if crot.x > 360 then
  396.     crot.x := 360 - crot.x;
  397.  
  398.   if kmup then
  399.   begin
  400.     cpos.y := cpos.y - movespeed * timestep;
  401.     exit;
  402.   end;
  403.  
  404.   if kmdown then
  405.   begin
  406.     cpos.y := cpos.y + movespeed * timestep;
  407.     exit;
  408.   end;
  409.  
  410.   if (kmleft and (kmforward or kmbackward)) or
  411.      (kmright and (kmforward or kmbackward)) then
  412.     newspeed := movespeed / 2 else
  413.       newspeed := movespeed;
  414.  
  415.   if kmforward then
  416.   begin
  417.     cpos.x := cpos.x - sin(degtorad(crot.y)) * newspeed * timestep;
  418.     cpos.z := cpos.z + cos(degtorad(crot.y)) * newspeed * timestep;
  419.   end;
  420.   if kmbackward then
  421.   begin
  422.     cpos.x := cpos.x + sin(degtorad(crot.y)) * newspeed * timestep;
  423.     cpos.z := cpos.z - cos(degtorad(crot.y)) * newspeed * timestep;
  424.   end;
  425.   if kmleft then
  426.   begin
  427.     cpos.x := cpos.x - sin(degtorad(crot.y - 90)) * newspeed * timestep;
  428.     cpos.z := cpos.z + cos(degtorad(crot.y - 90)) * newspeed * timestep;
  429.   end;
  430.   if kmright then
  431.   begin
  432.     cpos.x := cpos.x + sin(degtorad(crot.y - 90)) * newspeed * timestep;
  433.     cpos.z := cpos.z - cos(degtorad(crot.y - 90)) * newspeed * timestep;
  434.   end;
  435. end;
  436.  
  437. procedure TPreview.IdleHandler(Sender: TObject; var Done: Boolean);
  438. begin
  439.   CalcTimestep;
  440.  
  441.   Movement;
  442.  
  443.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  444.   glViewport(0, 0, ClientWidth, ClientHeight);
  445.   glMatrixMode(GL_PROJECTION);
  446.   glLoadIdentity;
  447.   gluPerspective(45, ClientWidth / ClientHeight, NearClipping, FarClipping);
  448.   glMatrixMode(GL_MODELVIEW);
  449.   glLoadIdentity;
  450.  
  451.   SetupOpengl;
  452.  
  453.   // Camera
  454.   glrotatef(crot.x, 1, 0, 0);
  455.   glrotatef(crot.y, 0, 1, 0);
  456.  
  457.   glTranslatef(cpos.x, cpos.y, cpos.z);
  458.  
  459.   UpdateLight;
  460.  
  461.   DrawMap;
  462.  
  463.   SwapBuffers(DC);
  464.   Done := false;
  465. end;
  466.  
  467. procedure TPreview.FormResize(Sender: TObject);
  468. var
  469.   tmpBool : Boolean;
  470. begin
  471.   glViewport(0, 0, ClientWidth, ClientHeight);
  472.   glMatrixMode(GL_PROJECTION);
  473.   glLoadIdentity;
  474.   gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
  475.  
  476.   glMatrixMode(GL_MODELVIEW);
  477.   glLoadIdentity;
  478.   IdleHandler(Sender, tmpBool);
  479. end;
  480.  
  481. procedure TPreview.FormDestroy(Sender: TObject);
  482. begin
  483.   Frustum.Free;
  484.   DeactivateRenderingContext;
  485.   DestroyRenderingContext(RC);
  486.   ReleaseDC(Handle, DC);
  487. end;
  488.  
  489. procedure TPreview.FormCreate(Sender: TObject);
  490. begin
  491.   if not QueryPerformanceFrequency(Frequency) then
  492.     Application.Terminate;
  493.   QueryPerformanceCounter(CalcTime);
  494.  
  495.   DC := GetDC(Handle);
  496.   if not InitOpenGL then
  497.     Application.Terminate;
  498.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  499.   ActivateRenderingContext(DC, RC);
  500.  
  501.   programpath := extractfilepath(paramstr(0));
  502.  
  503.   mpoly := true;
  504.   mtex := true;
  505.   mlight := true;
  506.   mbfc := true;
  507.   mfc := true;
  508.  
  509.   Frustum := TFrustum.Create;
  510.  
  511.   // Camera
  512.   crot := to_v3f(15, 0, 0);
  513.   cpos := to_v3f(0, -5, 0);
  514.  
  515.   LoadTextures;
  516.  
  517.   Application.OnIdle := IdleHandler;
  518. end;
  519.  
  520. procedure TPreview.FormKeyDown(Sender: TObject; var Key: Word;
  521.   Shift: TShiftState);
  522. begin
  523.   case key of
  524.     // Control
  525.     ord('W'): kmforward := true;
  526.     ord('S'): kmbackward := true;
  527.     ord('A'): kmleft := true;
  528.     ord('D'): kmright := true;
  529.     vk_space: kmup := true;
  530.     vk_control: kmdown := true;
  531.     vk_left: kleft := true;
  532.     vk_right: kright := true;
  533.     vk_up: kup := true;
  534.     vk_down: kdown := true;
  535.     // Screenshot
  536.     vk_f5: DoScreenshot;
  537.   end;
  538. end;
  539.  
  540. procedure TPreview.FormKeyUp(Sender: TObject; var Key: Word;
  541.   Shift: TShiftState);
  542. begin
  543.   case key of
  544.     ord('W'): kmforward := false;
  545.     ord('S'): kmbackward := false;
  546.     ord('A'): kmleft := false;
  547.     ord('D'): kmright := false;
  548.     vk_space: kmup := false;
  549.     vk_control: kmdown := false;
  550.     vk_left: kleft := false;
  551.     vk_right: kright := false;
  552.     vk_up: kup := false;
  553.     vk_down: kdown := false;
  554.   end;
  555. end;
  556.  
  557. end.
  558.  


das ist der komplette unzensierte code.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 13:03 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Bitte mal durchlesen:
http://wiki.delphigl.com/index.php/Tuto ... sen_finden

Ist nicht böse gemeint( :wink: ), aber im günstigsten fall sollte eine Klasse nicht mehr als 2 DIN-A4 Seiten füllen( Dies kann man zwar nicht immer erreichen, aber... ).

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 21, 2006 13:08 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
darum geht es hier aber nicht, ich hätte natürlich alles auslagern können, dann hätte ich hier aber 3 units anhängen müssen und keiner würde das blicken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 04:43 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Damit jetzt mal wirklich klar wird wo das Licht hinfällt, mach doch mal das Bodengitter feiner. Am besten so, dass die Polygone ~10 Pixel auf dem Bildschirm groß sind. Dein Screenshot zeigt zwar mehrere Lichtpunkte, das heißt aber noch nicht, das bei genügend vielen Zwischenvertices nicht doch ein Zusammenhang entsteht.
Also Screenshot-Update biddö!
Wenn sich jetzt rausstellt, dass alles in Ordnung ist lach ich mich schepp ^^.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 14:33 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 18:26
Beiträge: 17
Wohnort: Halle, Sachsen-Anhalt
Also bei mir kenne ich den Fehler schon lange. Er liegt im Lichtmodell für spiegelndes Licht. Dort wird mit dem Halfway Vektor gearbeitet, was allenfalls eine Näherung ist, aber nur bei bestimmten Objekten (z.b. Kugeln) realistisch wirkt. Wenn man den spiegelnden Anteil realistisch darstellen will, muss man auf die Lichtreflektion zurückgreifen:
Einfallswinkel = Ausfallswinkel
Ich habe die Lösung für den spiegelnden Anteil nicht im Kopf, ich schaue aber nochmal nach und poste sie. Sie müsste aber in die Richtung Reflexionswinkel dotproduct Normale laufen, evtl. zusätzlich mit nem Glanzpunktfaktor.
Definitiv kann ich aber sagen, dass auch mit korrekter Berechnung das ganze nicht realistisch ist, da bei OpenGL auch der Specular-Anteil eine Abschwächung ist.
Richtig wäre, zuerst ambient und diffuse zu berechnen, dann mit additiven Blending den spiegelnden Anteil hinzufügen.

_________________
"Wer nicht arbeitet, kann auch nichts falsch machen"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 14:39 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich hab aber keine spiegelungen Oo

(der gepostete source ist von dem projekt hier http://www.exec-dev.de/editor2.jpg), die bilder aus einem anderen

2 neue screenshots: 128*128 polygone auf dem boden:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 14:59 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 18:26
Beiträge: 17
Wohnort: Halle, Sachsen-Anhalt
Du irrst dich, du benutzt den specularen Anteil des Lichtes. Das ist ja praktisch eine Art spiegelnder Anteil (Glanzlichter). Das ist auch der Grund, warum bei shininess auf 0 der Fehler verschwindet (es reduziert die Größe der Glanzlichter auf absolut 0).

_________________
"Wer nicht arbeitet, kann auch nichts falsch machen"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 15:05 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
und was kann ich genau dagegen tun, und warum bin ich scheinbar der einzige (außer dir) dem der fehler bekannt ist Oo sowas muss doch afaik häufig auftreten Oo

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Seth hat geschrieben:
und was kann ich genau dagegen tun, und warum bin ich scheinbar der einzige (außer dir) dem der fehler bekannt ist Oo sowas muss doch afaik häufig auftreten Oo

Nicht zwingend. Du benutzt nun mal das OpenGL Licht und das wird wiederrum eher sehr selten verwendet, da es Vertexbasierend ist. Häufiger Anwendung finden Shader und dabei wird dann nur genau das benutzt was auch im Shader steht. Oder eben Lichtsimulierende Techniken wie Lightmaps oder ähnliches um dynamisches Licht zu ermöglichen. Und das ist nicht mal Licht im klassischen Sinn.

Aber wie LBF sagt benutzt du Specular bei deinem Material. Setzt die Werte einfach mal alle auf 0. Dann sollte es rein theopraktisch weg sein. Evtl genügt es auch, wenn du das Setzen des Speculars weglässt. Allerdings könnte das auch dazu führen, dass der Treiber dort freie Hand hat und es wieder setzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 22, 2006 18:58 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ohne specular gehts, danke, mit shadern kenn ich mich leider net so aus, bzw hab ich noch nie damit gearbeitet.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 23, 2006 19:17 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Aha, wie ich es mir dachte. Und da ich mich ja schepp lachen wollte: :lol: :D :P :) :D :lol:
Unter anderem aus dem Grund, dass bei groben Polygonen das Licht mieserabel aussieht hatte ATi der Radeon 8500 die Fähigkeit verpasst in Echtzeit grobe Meshes (wie bei dir der Boden) in feinere Polygone zu unterteilen. Das Resultat waren glatter wirkende Objekte und knackiges specular lighting wie du es verwendest.
Also der 'Fehler' ist auch der Industrie bekannt. Seit Shader mehr Anwendung gefunden haben, hat ATi den Hardware-Support allerdings wieder entfernt. Wie Lossy schon sagte: Wenn man sich jedes erdenkliche Licht Pixelgenau selber programmieren kann, warum dann Ressourcen in genaueres Per-Vertex-Licht stecken?

Falls du ohne Shader weitermachen willst, da fallen mir noch zwei Einstellungen ein, die ich 'damals' genutzt habe.
Die eine lässt den Glanzpunkt nach der Texturierung auftragen, statt einfach die Textur mit maximaler Helligkeit zu zeichnen, was meist besser aussieht: http://www.opengl.org/resources/code/sa ... ode63.html
Die andere erzeugt Glanzpunkte genau an der Stelle wo das Licht besonders hell ist, anstatt den Einfallswinkel und Ausfallswinkel zu berücksichtigen. Das würde dann bedeuten, dass der Glanzpunkt sich nicht mit dem Betrachter bewegt, falls du sowas suchst. Den GL-Befehl weiß ich aber nicht mehr.

Viel Spaß noch beim Erleuchten/erleuchtet werden


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 24, 2006 14:29 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
danke, wenn ich ahnung von shadern hätte, würde ichs ja auch über shader machen ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 26, 2006 15:31 
Offline
DGL Member

Registriert: Mi Mär 22, 2006 18:26
Beiträge: 17
Wohnort: Halle, Sachsen-Anhalt
Mit shadern geht es relativ einfach, ich poste einfach mal einen für ganz einfache punktlichtquellen:

!!ARBvp1.0
OPTION ARB_position_invariant;
TEMP refl_vec,view_vec,light_dir,h1,h2,temp_col;

# Pass texture coordinates to result
MOV result.texcoord[0],vertex.texcoord[0];
MOV result.texcoord[1],vertex.texcoord[1];
MOV result.texcoord[2],vertex.texcoord[2];
MOV result.texcoord[3],vertex.texcoord[3];

# Calc light dir and normalize it
SUB light_dir,state.light[0].position,vertex.position;
DP3 h1,light_dir,light_dir;
RSQ h1,h1.x;
MUL light_dir,light_dir,h1;

# Calc view vector
SUB view_vec,program.env[0],vertex.position;
DP3 h1,view_vec,view_vec;
RSQ h1,h1.x;
MUL view_vec,view_vec,h1;

# Calc reflection vector
DP3 h1.x,vertex.normal,light_dir;
MUL h1.x,h1.x,2;
MAD refl_vec,h1.x,vertex.normal,-light_dir;

# Lit
DP3 h1.x,light_dir,vertex.normal;
DP3 h1.y,refl_vec,view_vec;
MOV h1.w,state.material.shininess.x;
LIT h1,h1;
MUL temp_col,state.material.diffuse,state.light[0].diffuse;
MUL h2,temp_col,h1.y;
MAD h2,state.material.ambient,state.light[0].ambient,h2;
MUL temp_col,state.material.specular,state.light[0].specular;
MAD h2,temp_col,h1.z,h2;
MOV result.color.xyz,h2;
MOV result.color.w,vertex.color.w;

END

Specular basiert hier einfach nur auf dem winkelunterschied zwischen reflektionsvektor und vektor zum betrachter.
Dazu muss man natürlich vor jedem renderingaufruf dem programm die kameraposition mitteilen
gls1->glext_man->glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB,0,
gls1->camera.pos[0],
gls1->camera.pos[1],
gls1->camera.pos[2],0.0f);
Jede Lichtquelle muss aber einzeln gerendert werden, wenn man das vertex program modular halten will. Für den specular anteil rendert man zuerst ambient und diffuse (also diese farben ungleich 0.0f setzen), dann mit additiven blending den specular teil. Dafür setzt man die farben für ambient/diffuse auf 0, von specular auf ungleich 0. Das ist kein besonderes vertex program, nur ein einfacher standart zum rumprobieren und testen, wie per-vertex lighting funktioniert (praktischerweise lässt sich natürlich so die lichtquelle bewegen).

_________________
"Wer nicht arbeitet, kann auch nichts falsch machen"


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.045s | 18 Queries | GZIP : On ]