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

Aktuelle Zeit: Fr Jul 18, 2025 00:37

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



Ein neues Thema erstellen Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 09, 2004 19:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hm, sag mal was in DrawShadows und DrawMap alles drin ist, evtl. liegts daran. Denn der Rest des obigen Codes (sofern du die Stencilmaske auf 255 gesetzt hast) sieht eigentlich korrekt aus, hab dass nämlich mal mit meinem verglichen und die marginalen Unterschiede dürften kein Fehlergrund sein.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 09, 2004 19:26 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
nagut, ist vielleicht ein bisschen unübersichtlich, aber...

drawshadows:

Code:
  1.  
  2. procedure drawshadows;
  3. const shadowlength = 500;
  4.  
  5. var i,a,b,p : integer;
  6.     x,y,z : single;
  7.     V, V1, V2 : TVector;
  8.     VE1, VE2, VE3 : TAffineVector;
  9.     V3,V4 : TVector;
  10.     polyfaceslight, poly2faceslight : boolean;
  11.  
  12. begin
  13.  for i:=0 to map.objects-1 do
  14.    for a:=0 to high(map.obj[i].edgearray) do begin
  15.     //== First find the point light's vector to the edge
  16.     V[0]:= map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].x-light.x;
  17.     V[1]:= map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].y-light.y;
  18.     V[2]:= map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].z-light.z;
  19.  
  20.     //== Normalize the Vector
  21.     V3[0] := V[0] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  22.     V3[1] := V[1] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  23.     V3[2] := V[2] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  24.     V3[3] := 1;
  25.  
  26.     V:=V3;
  27.  
  28.     Ve3[0] := V[0];
  29.     Ve3[1] := V[1];
  30.     Ve3[2] := V[2];
  31.  
  32.     //== Now determine if the edge has a triangle that faces the light and one
  33.     //== that doesn't face it
  34.  
  35.     //== Get Triangle #1's Normal Vector
  36.     V2[0] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[0]].normal[1];
  37.     V2[1] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[0]].normal[2];
  38.     V2[2] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[0]].normal[3];
  39.  
  40.     //== Now do the vector dot product
  41.     polyfaceslight:=false;
  42.     if (V[0]*V2[0]+V[1]*V2[1]+V[2]*V2[2]>= 0) then polyfaceslight:=true;
  43.  
  44.     //== Now do the same thing for the other triangle...
  45.     V2[0] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[1]].normal[1];
  46.     V2[1] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[1]].normal[2];
  47.     V2[2] := map.obj[i].Polygon[ map.obj[i].edgearray[a].triangle[1]].normal[3];
  48.  
  49.     poly2faceslight:=false;
  50.     if ( V[0]*V2[0]+V[1]*V2[1]+V[2]*V2[2]>=0) then poly2faceslight:=true;
  51.  
  52.     //== If polyfaceslight != poly2faceslight, then it is an silhouette edge
  53.     if NOT (polyfaceslight = poly2faceslight) then begin
  54.       VE1[0] := V[0];
  55.       VE1[1] := V[1];
  56.       VE1[2] := V[2];
  57.       //== Get Vector from light to the other edge vertex to make correct shadows
  58.       V[0]:=map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].x - light.x;
  59.       V[1]:=map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].y - light.y;
  60.       V[2]:=map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].z - light.z;
  61.  
  62.       //== Normalize the Vector
  63.       V4[0] := V[0] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  64.       V4[1] := V[1] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  65.       V4[2] := V[2] / (sqrt( sqr(v[0]) + sqr(v[1]) + sqr(v[2]) ));
  66.  
  67.       V := V4;
  68.  
  69.       VE2[0] := V[0];
  70.       VE2[1] := V[1];
  71.       VE2[2] := V[2];
  72.  
  73.       //== Now Extrude the edges to length = 500
  74.       VE1[0] := VE1[0]*shadowlength; VE1[1] := VE1[1]*shadowlength; VE1[2] := VE1[2]*shadowlength;
  75.       VE2[0] := VE2[0]*shadowlength; VE2[1] := VE2[1]*shadowlength; VE2[2] := VE2[2]*shadowlength;
  76.       //== And now only add VE1/2 to the edge vertices and...
  77.       VE1[0] := VE1[0] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].x;
  78.       VE1[1] := VE1[1] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].y;
  79.       VE1[2] := VE1[2] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[0]].z;
  80.  
  81.       VE2[0] := VE2[0] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].x;
  82.       VE2[1] := VE2[1] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].y;
  83.       VE2[2] := VE2[2] + map.obj[i].vertexinfo[map.obj[i].edgearray[a].vertex[1]].z;
  84.  
  85.       //== ... render the quad!
  86.  
  87.       with map.obj[i].edgearray[a] do begin
  88.       //Look if it's clockwise or not
  89.       if (vectoraffinedotproduct(vectorcrossproduct(VE1,VE2),VE3)>=0) then begin //== If yes, then draw it that way
  90.       glbegin(gl_quads);
  91.         glvertex3f(map.obj[i].vertexinfo[vertex[0]].x,
  92.                    map.obj[i].vertexinfo[vertex[0]].y,
  93.                    map.obj[i].vertexinfo[vertex[0]].z);
  94.         glvertex3f(VE1[0]     ,VE1[1]     ,VE1[2]);
  95.         glvertex3f(VE2[0]     ,VE2[1]     ,VE2[2]);
  96.         glvertex3f(map.obj[i].vertexinfo[vertex[1]].x,
  97.                    map.obj[i].vertexinfo[vertex[1]].y,
  98.                    map.obj[i].vertexinfo[vertex[1]].z);
  99.       glend;
  100.       end
  101.       else begin //== If not, draw it the other way
  102.         glbegin(gl_quads);
  103.         glvertex3f(map.obj[i].vertexinfo[vertex[1]].x,
  104.                    map.obj[i].vertexinfo[vertex[1]].y,
  105.                    map.obj[i].vertexinfo[vertex[1]].z);
  106.         glvertex3f(VE2[0]     ,VE2[1]     ,VE2[2]);
  107.         glvertex3f(VE1[0]     ,VE1[1]     ,VE1[2]);
  108.         glvertex3f(map.obj[i].vertexinfo[vertex[0]].x,
  109.                    map.obj[i].vertexinfo[vertex[0]].y,
  110.                    map.obj[i].vertexinfo[vertex[0]].z);
  111.       glend;
  112.       end;
  113.  
  114.       //== Linien zeichnen
  115.  
  116.       gldisable(gl_depth_test);
  117.       gllinewidth(2);
  118.       glbegin(gl_line_strip);
  119.         glvertex3f(map.obj[i].vertexinfo[vertex[0]].x,
  120.                    map.obj[i].vertexinfo[vertex[0]].y,
  121.                    map.obj[i].vertexinfo[vertex[0]].z);
  122.         glvertex3f(VE1[0]     ,VE1[1]     ,VE1[2]);
  123.         glvertex3f(VE2[0]     ,VE2[1]     ,VE2[2]);
  124.         glvertex3f(map.obj[i].vertexinfo[vertex[1]].x,
  125.                    map.obj[i].vertexinfo[vertex[1]].y,
  126.                    map.obj[i].vertexinfo[vertex[1]].z);
  127.       glend;
  128.       glenable(gl_depth_test);
  129.  
  130.  
  131.       end;
  132.  
  133.     end;
  134.   end;
  135. end;
  136.  


okay das war drawshadows... hier drawmap, da ist eigentlich nichts interessantes dran:

Code:
  1.  
  2. procedure drawmap;
  3. var i,a,b : integer;
  4.  
  5. begin
  6.   for i:=0 to map.objects-1 do
  7.       for a:=0 to map.obj[i].polygons-1 do begin
  8.         map.tex[map.obj[i].polygon[a].textureid].texture.Bind;
  9.  
  10.         glbegin(gl_polygon);
  11.         for b:=0 to map.obj[i].polygon[a].vertices-1 do begin
  12.           glTexCoord2f(map.obj[i].polygon[a].UVCoord[b].UV1,map.obj[i].polygon[a].UVCoord[b].UV2);
  13.           glnormal3f  (map.obj[i].polygon[a].normal[1],map.obj[i].polygon[a].normal[2],map.obj[i].polygon[a].normal[3]);
  14.           glvertex3f  (map.obj[i].vertexinfo[ map.obj[i].polygon[a].Usedvertex[b] ].x,
  15.                        map.obj[i].vertexinfo[ map.obj[i].polygon[a].Usedvertex[b] ].y,
  16.                        map.obj[i].vertexinfo[ map.obj[i].polygon[a].Usedvertex[b] ].z);
  17.         end;
  18.         glend;
  19.     end;
  20. end;
  21.    


Hoffe, du findest dich zurecht ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 09, 2004 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hm, sieht soweit eigentlich in Ordnung aus, aber probier doch einfach mal das Winding zu tauschen, dann siehst du obs daran liegt (was ich mir vorstellen könnte). Ansonsten weiß ich jetzt spontan nicht wo das Problem liegt, aber vielleicht hab ich da was übersehen. Kannst du mal (wenns nicht am Winding liegt) den Source hochladen? Dann schau ich mir das mal im Quellcode an, das ist besser als dieses Rätselraten hier.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 09, 2004 21:01 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Hier, ich hoffe, ich hab nichts vergessen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 09, 2004 21:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dein Quellcode ist leider recht unübersichtlich und nicht grade toll formatiert (GL-Tokens schreibt man i.d.R. immer groß, begin...end gehören in eigene Zeilen, etc.) und du benutzt zudem noch DeleD-Maps. Aber mach mal das glDepthMask(False) nach dem ambienten Pass weg, denn dann siehst du direkt deine Schatten. Das darf allerdings nicht der Ursprung des Problems sein (zumal das ja da korrekt sitzt), sollte bei der Problemlösung aber helfen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 10, 2004 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Ah, ich habs :D Ich hatte ein bisschen mit dem Cullen und so rumgespielt, und dann gings.
Trotzdem vielen Dank :)
Werd mich jetzt mal ans zfail machen...


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]