Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 13.02.03 00:52 
Habe folgende Fläche definiert:
ausblenden Quelltext
1:
2:
3:
4:
Vertices[0] := GetCustomVertex(-1.0, 0.0, -1.0, $FFFF0000);
Vertices[1] := GetCustomVertex(1.0, 0.0, -1.0, $FFFF0000);
Vertices[2] := GetCustomVertex(-1.0, 0.0, 1.0, $FFFF0000);
Vertices[3] := GetCustomVertex(1.0, 0.0, 1.0, $FFFF0000);


die Koordinaten sind x,y,z

Aber was dabei rauskommt sieht net so gut aus. Hab in der hinteren Kante ein dreieckiges schwarzes Loch (ok, net ganz schwarz, aber is net schee *g*). Ich glaub da stimmt was an der Reihenfolge. Ich mach das Teil als TRIANGLESTRIP.

Wer kann mir das mit der Reihenfolge mal richtig erklären?

Bin noch Anfänger in dieser Sparte.. *g* also vorsichtig sein mit Antworten *g*

Gruß
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Do 13.02.03 13:20 
kenne nur OpenGL...
da ist es so, dass man die Koordinaten immer im Uhrzeigersinn angeben muss...
demnach müsstest du Vertieces[2] und [3] vertauschen...

Einfach mal ausprobieren...
...oder zu OpenGL wechseln ;)

Fiji-Fighter
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Do 13.02.03 15:14 
Im DirectX SDK unter "Triangle Strips" kannst du alles nachlesen, und ein paar Abbildungen sind auch dabei.

Wenn ich mich nicht irre, werden für das erste Dreieck Vertices 0, 1 und 2 genommen und für das zweite 2, 1 und 3 (in dieser Reihenfolge!), danach würden 2, 3 und 4 kommen und schließen 4, 3 und 5. Wie Fiji-Fighter beschrieben hat, musst du die Vertices im Uhrzeigersinn (vom Betrachter aus gesehen) angeben, wenn du das Backface-Culling nicht anders eingestellt hast. Kannst es ja mal ausstellen, dann siehst du, ob der Fehler wirklich am Sinn liegt oder ob irgendwo anders was falsch ist ;C)

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 13.02.03 16:07 
Hab jetzt mal ein bisschen rumprobiert. Aber folgendes kommt dabei raus:

user defined image

Hab den Vertice-Index dazugemalt. Man, das is ja echt zum verzweifeln damit... *grml*. Folgendermaßen hab ich die Reihenfolge umgestellt
ausblenden Quelltext
1:
2:
3:
4:
Vertices[0] := GetCustomVertex(-1.0, 0.0, -1.0, $FFFF0000);
Vertices[1] := GetCustomVertex(-1.0, 0.0,  1.0, $FFFF0000);
Vertices[2] := GetCustomVertex( 1.0, 0.0, -1.0, $FFFF0000);
Vertices[3] := GetCustomVertex( 1.0, 0.0,  1.0, $FFFF0000);


Auch nach meinem Tutorial müsste das so funktionieren, weil bei einem Strip 0,1,2 zu einem Dreieck verbunden werden und jedes folgende Vertex mit den beiden vorhergehenden, also die 3 mit 1 und 2. Aber warum hab ich da den Schatten drin?

Gruß
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Fr 14.02.03 14:52 
Hi,

vertausch mal Nr. 2 und Nr. 3...

Das erste (0) gibt den Mittelpunkt an, die dannachfolgenden gehen im Uhrzeigersinn um das mittlere herum.

Au'revoir,
Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Sa 15.02.03 12:46 
@Aya: Was du beschreibst, sind Triangle Fans. UGrohne verwendet aber nach eigener Aussage Triangle Strips, und da denkt er schon richtig.

Der Screenshot sieht aber tatsächlich nach einem Triangle Fan aus. Vielleicht solltest du nochmal nachgucken, ob du wirklich einen Triangle Strip zeichnest ;c)

Vielleicht solltest du mal jedem Vertex eine eigene Farbe geben, dann siehst du vielleicht klarer (und ich meine natürlich einer rot, einer grün, einer blau und einer vielleicht weiß, und nicht vier verschiedene Rottöne (C; )

Der "Schatten" könnte auch darauf hindeuten, dass ein Vertexnormal nicht korrekt gesetzt ist... Andererseits gibst du ja gar keine Vertexnormalen an ;c) Was macht denn die Funktion GetCustomVertex?

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 15.02.03 15:15 
OK, ich poste hier jetzt noch den restlichen Code. Erstmal die Render-Funktion:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Rendervorgang
d3ddev8.BeginScene;
d3ddev8.Clear(0,nil,D3DCLEAR_TARGET OR D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0,0);

d3dDev8.SetStreamSource( 0, vBuffer, sizeof( CUSTOMVERTEX ));
d3dDev8.SetVertexShader( D3DFVF_CUSTOMVERTEX );
d3dDev8.DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 100 );

d3ddev8.EndScene;
d3ddev8.Present(nil,nil,0,nil);


Und noch die Funktion GetCustomVertex:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function GetCustomVertex(_x,_y,_z:single; _color:TD3DColor):CUSTOMVERTEX;
begin
with Result do begin
     x:=_x;
     y:=_y;
     z:=_z;
     color:=_color;
     end;
end;


Achja, natürlich noch das ViewSetup:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure SetupViewandProjection;
var
  matView, matProj: TD3DXMatrix;
  _v1, _v2, _v3 : TD3DXVector3;
begin
  // View.
  _v1 := D3DXVector3( 0.0, 2.5, -5.0);
  _v2 := D3DXVector3( 0.0, 0.0, 0.0);
  _v3 := D3DXVector3( 0.0, 1.0, 0.0);
  D3DXMatrixLookAtLH(matView, _v1, _v2, _v3);
  D3DDEV8.SetTransform(D3DTS_VIEW, matView);

  // Projection.
  D3DXMatrixPerspectiveFovLH(matProj, D3DX_PI / 4, Windowwidth/Windowheight, 1.0, 100.0);
  D3DDEV8.SetTransform(D3DTS_PROJECTION, matProj);
end;


Ich denke, das dürfte jetzt ausreichen.

Hab das mit den verschiedenen Farben auch mal probiert und folgendes kam raus: 0 is schwarz (sollte Rot sein), 1 ist rot (sollte grün sein), 2 ist grün (sollte blau sein) und 3 ist Gelb (sollte weiß sein).

D.h. wenn ich das richtig verstanden hab: Die Farben werden ja als $FF000000 übergeben z.B. ist das hier jetzt Rot? Dan ham wir die Farben (nach Binär-System) Rot, Grün, Blau und die vierte Binärzahl ist der Alpha-Kanal für die Transparenz?

Gruß
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Sa 15.02.03 21:08 
Zitat:

d3dDev8.DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 100 );

Wenn ich mich nicht irre, willst du genau zwei Primitive rendern. Warum gibst du also 100 an? Wenn man hier falsche Parameter eingibt, können zum einen Darstellungsfehler auftreten (vielleicht ist das hier ja so einer), zum anderen Bluescreens unter NT.

Clear würde ich übrigens VOR BeginScene setzen. Ich weiß nicht, ob es einen Unterschied macht, aber zum einen macht Microsoft das immer so, zum anderen kann es sein, dass Clear im 2D-Modus abläuft, das heißt, die Grafikkarte schaltet in 3D mit BeginScene, dann 2D, Clear, und wieder 3D, das verzögert. Bei letzterem bin ich mir in diesem Fall aber nicht sicher. Jedenfalls umgehst du die Problematik, indem du den Clear-Aufruf vorher machst ;C)

Am View-Setup sollte das nicht liegen...

Die Farben sind standardmäßig: AARRGGBB.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 15.02.03 23:13 
OregonGhost hat folgendes geschrieben:
Zitat:

d3dDev8.DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 100 );

Wenn ich mich nicht irre, willst du genau zwei Primitive rendern. Warum gibst du also 100 an? Wenn man hier falsche Parameter eingibt, können zum einen Darstellungsfehler auftreten (vielleicht ist das hier ja so einer), zum anderen Bluescreens unter NT.


Danke, danke *g*. Hab mir das Ding irgendwie nimmer richtig angeschaut, hatte davor nen Zylinder gezeichnet mit 100 Vertices *g*. und danke für die Korrektur der Farbwerte, jetzt klappt das auch.

So, jetzt gehts weiter mit Texturen *g*

Gruß
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: So 16.02.03 14:07 
Was übrigens die Farbwerte angeht: Du machst es dir einfacher, indem du die Makros D3DCOLOR_ARGB, D3DCOLOR_RGBA, D3DCOLOR_XRGB sowie D3DCOLOR_COLORVALUE verwendest. Letzteres nimmt auch RGBA, allerdings im float-Format (Komponenten zwischen 0 und 1). Weiß aber nicht, inwieweit diese Makros für Delphi übersetzt sind, weil Object Pascal weder Makros noch inline-Funktionen unterstützt (-> Overhead).

Aber ich freue mich, dass ein Neuling von sich aus den Pfad des Lichts (nämlich Direct3D) eingeschlagen hat, ohne ob der anfänglichen Schwierigkeiten frustiert zu OpenGL zu wechseln ;c)

Ich weiß nicht, wie weit Delphi das unterstützt, aber wenn du die Debug-Runtime von DirectX verwendest, kannst du solche Fehler eventuell leichter aufstöbern, weil diese Runtime Meldungen an den Debugger macht, von wegen Parameter-Validierung und so.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.