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

Aktuelle Zeit: Sa Jun 08, 2024 02:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Stencil-Schatten
BeitragVerfasst: Mo Sep 15, 2008 16:23 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Ich versuche einen Schatten einer Kugel darzustellen. Aber das ganze funktioniert nicht.
Ich habe folgende Seite als Quelle genommen: http://www.gamedev.de/index.php?name=News&file=article&sid=90
Hab ich irgendwas übersehen?
Falsch gemacht?

Code:
  1.  
  2.  
  3. unit Unit1;
  4.  
  5. interface
  6.  
  7. uses
  8.  
  9.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  10.   Dialogs, dglOpenGL, ExtCtrls, StdCtrls;
  11.  
  12. type
  13.  
  14.   TForm1 = class(TForm)
  15.  
  16.     Timer1: TTimer;
  17.  
  18.     procedure FormCreate(Sender: TObject);
  19.     procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
  20.     procedure FormDestroy(Sender: TObject);
  21.     procedure Timer1Timer(Sender: TObject);
  22.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  23.  
  24.   private
  25.  
  26.     procedure Render();
  27.  
  28.     { Private-Deklarationen }
  29.  
  30.   public
  31.  
  32.     { Public-Deklarationen }
  33.  
  34.   end;
  35.  
  36. const
  37.  
  38.   NearClipping = 1;
  39.  
  40.   FarClipping = 1000;
  41.  
  42.   mat_specular   : Array[0..3] of GlFloat = (4.400, 1.0, 1.0, 1.0);
  43.   mat_shininess  : Array[0..0] of GlFloat = (9.060);
  44.   mat_ambient    : Array[0..3] of GlFloat = (6.897, 0.4, 0.4, 1.0);
  45.   mat_diffuse    : Array[0..3] of GlFloat = (9.400, 0.8, 0.4, 1.0);
  46.  
  47.   light_position : Array[0..3] of GlFloat = (4.400, 10.0, 0.0, 1.0);
  48.   light_ambient  : Array[0..3] of GlFloat = (2.800, 0.80, 0.8, 1.0);
  49.   light_diffuse  : Array[0..3] of GlFloat = (4.060, 0.80, 0.8, 1.0);
  50.  
  51. var
  52.  
  53.   Form1 : TForm1;
  54.  
  55.   DC : HDC;
  56.   RC : HDC;
  57.  
  58.   Kugel : PGLUQuadric;
  59.  
  60.   Rotation : Integer;
  61.  
  62. implementation
  63.  
  64. {$R *.dfm}
  65.  
  66. procedure TForm1.FormCreate(Sender: TObject);
  67. begin
  68.  
  69.  ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_HIDE);
  70.  
  71.  DoubleBuffered := True;
  72.  
  73.  Rotation := -360;
  74.  
  75.  Cursor := -1;
  76.  
  77.  DC := GetDC(Handle);
  78.  
  79.    if (not InitOpenGL) then
  80.  
  81.        Application.Terminate;
  82.  
  83.  RC := CreateRenderingContext(DC,
  84.                               [opDoubleBuffered],
  85.                               17,
  86.                               32,
  87.                               0,0,0,
  88.                               0);
  89.  
  90.  ActivateRenderingContext(DC, RC);
  91.  
  92.  glClearColor(9.0, 9.0, 9.0, 9.0);
  93.  
  94.  glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  95.  glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  96.  glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  97.  glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  98.  
  99.  glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  100.  glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  101.  glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  102.  
  103.  glEnable(GL_LIGHTING);
  104.  glEnable(GL_LIGHT0);
  105.  
  106.  glEnable(GL_Line_SMOOTH);
  107.  glEnable(gl_alpha_test);
  108.  glEnable(GL_Blend);
  109.  
  110.  glIsEnabled(GL_TEXTURE_GEN_S);
  111.  
  112.  glDisable(GL_Texture_2D);
  113.  
  114.  Kugel :=gluNewQuadric();
  115.  
  116.  glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR);
  117.  
  118.  Align := alNone;
  119.  
  120.  Height := Screen.Height;
  121.  Width := Screen.Width;
  122.  
  123. end;
  124.  
  125. procedure TForm1.Render();
  126.  
  127.  var
  128.  
  129.   Flash : Integer;
  130.  
  131. begin
  132.  
  133.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  134.  
  135.  glMatrixMode(GL_PROJECTION);
  136.  glLoadIdentity;
  137.  gluPerspective(45, ClientWidth / ClientHeight, NearClipping, FarClipping);
  138.  
  139.  glMatrixMode(GL_MODELVIEW);
  140.  glLoadIdentity;
  141.  
  142.  glTranslatef(0, 0, -10);
  143.  glScalef(1, 1, 1);
  144.  
  145.  glRotatef(Rotation, 0, 1, 0);
  146.  glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  147.  
  148.  Randomize();
  149.  
  150.  glColorMask(FALSE, FALSE, FALSE, FALSE);
  151.  
  152.  glDepthMask(FALSE); // Schreiben in den Depth-Buffer ausschalten
  153.  
  154.  // Stencil-Test einschalten
  155.  
  156.  glEnable(GL_STENCIL_TEST);
  157.  glStencilFunc(GL_ALWAYS, 1, clGreen);
  158.  glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
  159.  
  160.  // Face-Culling richtig einstellen
  161.  
  162.  glEnable(GL_CULL_FACE);
  163.  glFrontFace(GL_CCW);
  164.  
  165.  // Schatten-Volumen zeichnen <-
  166.  
  167.  glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); // Stencil-Operation umstellen
  168.  
  169.  glFrontFace(GL_CW);                     // Face-Culling "umkehren"
  170.  
  171.  // Schatten Volumen noch einmal zeichnen <-
  172.  
  173.  glFrontFace(GL_CCW);                    // Face-Culling wieder "normal" einstellen
  174.  
  175.  glColorMask(TRUE, TRUE, TRUE, TRUE);    // Schreiben in den Color-Buffer wieder einschalten
  176.  
  177.  glStencilFunc(GL_NOTEQUAL, 0, clGreen); // Nur dort zeichnen, wo der Stencil-Buffer ungleich 0 ist
  178.  
  179.  glPushMatrix();
  180.  
  181.       for Flash := 0 to 3 do
  182.       begin
  183.  
  184.        glBegin(GL_LINE_LOOP);
  185.          glVertex3f( random(3) - 1, random(3) - 1, random(3) - 1);
  186.          glVertex3f( random(3) - 1, random(3) - 1, random(3) - 1);
  187.          glVertex3f( random(3) - 1, random(3) - 1, random(3) - 1);
  188.          glVertex3f( random(3) - 1, random(3) - 1, random(3) - 1);
  189.        glEnd;
  190.  
  191.       end;
  192.  
  193.    gluSphere(Kugel, 2, 32, 32);
  194.  
  195.  glPopMatrix();
  196.  
  197.  // "Normale" Einstellungen wiederherstellen
  198.  
  199.  glDepthMask(TRUE);
  200.  glDisable(GL_STENCIL_TEST);
  201.  
  202.  SwapBuffers(DC);
  203.  
  204. end;
  205.  
  206. procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
  207. begin
  208.  
  209.  glViewport(0, 0, ClientWidth, ClientHeight);
  210.  glMatrixMode(GL_PROJECTION);
  211.  glLoadIdentity;
  212.  gluPerspective(3, ClientWidth / ClientHeight, NearClipping, FarClipping);
  213.  
  214.  glMatrixMode(GL_MODELVIEW);
  215.  glLoadIdentity;
  216.  
  217.  Render();
  218.  
  219. end;
  220.  
  221. procedure TForm1.FormDestroy(Sender: TObject);
  222. begin
  223.  
  224.  ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_SHOW);
  225.  
  226.  DeactivateRenderingContext;
  227.  DestroyRenderingContext(RC);
  228.  ReleaseDC(Handle, DC);
  229.  
  230. end;
  231.  
  232. procedure TForm1.Timer1Timer(Sender: TObject);
  233. begin
  234.  
  235.     if (Rotation < 360) then
  236.  
  237.        inc(Rotation)
  238.  
  239.    else
  240.  
  241.        Rotation := -360;
  242.  
  243.  Render();
  244.  
  245. end;
  246.  
  247. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  248. begin
  249.  
  250.  ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_SHOW);
  251.  
  252.  gluDeleteQuadric(Kugel);
  253.  
  254.  DeactivateRenderingContext;
  255.  DestroyRenderingContext(RC);
  256.  ReleaseDC(Handle, DC);
  257.  
  258. end;
  259.  
  260. end.
  261.  
  262.  


Die zwei Kommentare bei denen ich mir nicht sicher bin ob dort noch etwas stehen muss habe ich mit einem <- versehen.


Zuletzt geändert von Cre@or am Di Sep 16, 2008 16:07, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 11:54 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Weiss denn wirklich niemand was hier falsch läuft?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Präzisier dein Problem mal bitte ein wenig. Ein einfaches "funktioniert nicht" lässt kaum Rückschlüsse zu, und nur wenige Leute welzen sich gerne durch andere Leute Quellcode. Was mir aber direkt aufgefallen ist, ist die Tatsache dass du garkeinen Stencilpuffer für deinen Renderkontext anforderst, evtl. liegt es also daran.

Edit : Ausserdem renderst du ja da nirgends ein echtes Schattenvolumen, oder hast du die Zeilen aus dem Code rausgelassen? Normalerweise musst du für einen Mesh Konnektivitätsinformationen, und daraus dann dein Schattenvolumen erstellen. In deinem Code seh ich weder das eine noch das andere.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 15:27 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Danke erst mal für die Antwort!
Was die Sache mit den nicht vorhandenen Quelltext angeht, da hast du mir zumindest was mein nächstes Ziel ist weitergeholfen.
Nämlich den Stencilpuffer und das Schattenvolumen erstellen.
Mal schauen ob ich das hinbekomme... :mrgreen:

Edit: Ähm, nein das ist der gesamte Code...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 16:06 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Muss ich in das Projekt noch irgend eine Pas-Datei einbinden damit ich
Code:
  1. RenderShadowVolumes;
aufrufen kann?
Fehlermeldung des Compilers: Undefinierter Bezeichner 'RenderShadowVolumes'

mfg Cre@or


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich fürchte, diese Funktion musst du selber bauen... Das wird darauf hinauslaufen, die berechneten Schattenvolumen zu rendern, damit den Stencilpuffer befüllen und danach die Szene rendern (so ungefähr, siehe auch Volumetrische Stencilschatten).

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 17, 2008 07:34 
Offline
DGL Member

Registriert: Do Sep 11, 2008 17:54
Beiträge: 41
Na gut, dann werd ich da wohl durch müssen :(
Aber danke für den Hinweis.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 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.175s | 17 Queries | GZIP : On ]