Autor Beitrag
ShadowThief
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Mi 24.09.03 22:32 
hallo,

ich hab ein problem bei meiner dirextX9-render methode,
hier ist sie:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  // Clear the backbuffer to a blue color
  if Failed(D3DDevice.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 128, 0), 1.0, 0)) then
    Caption := 'device couldn''t be cleared. ';

  // Begin the scene
  if D3DDevice.BeginScene <> D3D_OK then
    Caption := 'screen couldn''t be began. ';

  if D3DDevice.SetVertexShader(nil) <> D3D_OK then
    Caption := 'setvertexshader failed. ';
  if D3DDevice.SetStreamSource(0, MyTriangleVertexBuffer, SizeOf(TTriangle), 0) <> D3D_OK then
    Caption := 'setstreamsource failed. ';
  if D3DDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1) <> D3D_OK then
    Caption := 'drawprimitive failed. ';

  // End the scene
  if D3DDevice.EndScene <> D3D_OK then
    Caption := 'screen couldn''t be ended. ';

  // Present the backbuffer contents to the display
  D3DDevice.Present(nil, nil, 0, nil);


D3DDevice.DrawPrimitive funktioniert nicht, also liefert nicht D3D_OK
zurück. das dreieick wird auch nicht gezeichnet.

kann mir bitte jemand sagen, woran das liegt?
vielen dank im vorraus.

shadow.
ShadowThief Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Do 25.09.03 08:53 
ich hab weiter nach meinem fehler gesucht, und zwar liefert DrawPrimitive den fehlercode -2005530516 zurück, den hab ich dann in hexdezimal umgewandelt: FFFFFFFF8876086C. wenn man die ganzen F's am anfang weglässt, findet man bei google unter 8876086C einen hinweis. und zwar scheint es ein vertex-shader problem zu sein. ich weis leider nichts über vertex-shader in directX9, einfach weglassen kann man es nicht, dann kommt der gleiche fehler.

hat jemand einen anhaltspunkt?

danke.
shadow.

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 25.09.03 10:23 
Hab auch keine ahnung von vertex-shadern...möglich das dein FVF falsch ist oder böse renderstates / caps?

in so einem fall würd ich die spizialisten fragen:

www.neobrothers-forum.de -> delphi DirectX forum

viel spass noch :wink:

_________________
mfg.
mâximôv
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 25.09.03 10:37 
Da scheint der Fehler zu liegen: Ab DX9 heisst die Funktion ja anstelle SetVertexShader SetFVF(VertexShader), die für normale Vertex-Shader aufgerufen werden muss.

Cu,
Udontknow
ShadowThief Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Do 25.09.03 10:45 
@maximus,

hab vorhin in google nach einem delphi directX forum gesucht,
aber nur delphiX usw. gefunden. danke für den link.

ich hab mir schon gedacht, is jetzt n weng blöd hier die leute in ner
allgemeinen grafik-sektion über d3d-details auszuquetschen, aber
was soll man machen, wenn man icht weiterkommt?

@Udontknow

die funktion SetVertexShader gibt es schon, muss man aber ganz
komisch aufrufen, genau da lag bei mir der haken. ich ruf jetzt
die funktion SetFVF mit meinem CustomVertex auf:

ausblenden Delphi-Quelltext
1:
2:
3:
const
  D3DCustomVertex = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;
SetFVF(D3DCustomVertex)


der code produziert jetzt keine fehler mehr. allerdings wird das
dreieck auch nicht angezeigt.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 25.09.03 11:23 
Deshalb schrieb ich ja auch "für normale Vertexshader". :wink:

Das Dreieck wird nicht angezeigt. Da gibt es viele Ursachen. Falscher Ort? Falsche Kamera-Sicht? Falsche Projektionsmatrix? Vertexbuffer falsch oder überhaupt nicht gefüllt?

Was ist eigentlich D3DFVF_XYZRHW? Genauer, was ist der RHW-Teil?

Cu, :)
Udontknow

PS: DX-MSDN sagt, es wäre eine Angabe für ein transformed vertex, im Gegensatz zu D3DFVF_XYZ, was ein untransformierter Vertex sei. :roll:
Werden transformierte Vertices nicht von der World-Transform-Matrix betroffen?
ShadowThief Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Do 25.09.03 12:11 
oh mann :shock: ich versteh nur bahnhof ...

die sache ist die, wenn man keinen plan hat, und man findet im netz auch nicht ganau das, was man braucht, dann muss man sich halt von verschiedenen quellen die information herholen, die man für richtig hält. so ist auch mein bisheriges directX-testprogramm entstanden.

folgendes kann ich sagen: das dreieck ist an einem ort, an dem is normalerweise angezeigt werden müsste. die kamera hab ich nicht irgendwie verschoben oder sonstwas. folgenden code für die matrizen (es soll eine 2d-darstellung werden, deswegen die orthomatrix, vielleicht ist das ja ein fehler):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  D3DXMatrixOrthoLH(D3DOrthoMatrix, formMain.ClientWidth,
                                  formMain.ClientHeight, 0.0, 1.0);

  if Failed(D3DDevice.SetTransform(D3DTS_PROJECTION, D3DOrthoMatrix)) then
    Caption := 'projection matrix couldn''t be set ';
  if Failed(D3DDevice.SetTransform(D3DTS_VIEW, D3DXMatrixIdentity)) then
    Caption := 'view matrix couldn''t be set ';


vertexbuffer hab ich gefüllt. alles mit HResult = D3D_OK .

was dieses RHW genau ist, weiss ich auch nicht, hat glaub ich auch irgendwas mit 2d zu tun. oje oje ... :cry:

shadow.

Moderiert von user profile iconTino: Überflüssige Beiträge entfernt.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 25.09.03 12:40 
Hmmm. Ok. Da musst du dir noch ein bisschen Wissen aneignen.

Setze mal folgendes:
ausblenden Quelltext
1:
2:
3:
FDevice.SetRenderState(D3DRS_ZENABLE, D3DZB_False);
FDevice.SetTransform(D3DTS_View, IdentityMatrix);
FDevice.SetTransform(D3DTS_World, IdentityMatrix);


Der erste Befehl deaktiviert den Z-Buffer, der für die Tiefenwirkung (ein Würfel hinter einer Wand wird nicht gezeichnet) verantwortlich ist, da du nur 2D brauchst, ist das überflüssig.

Mit dem zweiten Befehl setzt du die View-Matrix. Die entscheidet, von wo und wohin die Kamera sozusagen kuckt.

Der dritte Befehl setzt die Worldmatrix, das ist eine Matrix, mit der man die zu rendernden Objekte vergrößern/verkleinern, verschieben, drehen kann.
Wenn du die IdentityMatrix daran übergibst, wird jedes Objekt, das du per DrawPrimitive zeichnest, am Ursprungspunkt (0,0,0) gerendert. Wenn du also einen Punkt bei (-100,0,0) zeichnest, erscheint er genau dort.

Wendest du aber folgendes an:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
var Mat:TD3DXMatrix;
...
D3DXMatrixIdentity(Mat);
D3DXMatrixTranslation(mat,-27,90,0);
FDevice.SetTransform(D3DTS_World, IdentityMatrix);
FDevice.DrawPrimitive...


Würde derselbe Punkt nun bei (-127,90,0) ausgegeben werden, du hättest dann das Objekt sozusagen verschoben.

Pfff... Da gibt es noch so viele Dinge, die ich teilweise auch nicht so verstehe... Schau erstmal, ob dir das vielleicht weiterhilft.

Cu,
Udontknow

PS: Vielleicht liegt´s daran, daß du keine Lichtquelle hast?
ShadowThief Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Do 25.09.03 13:07 
Udontknow hat folgendes geschrieben:
ausblenden Quelltext
1:
FDevice.SetRenderState(D3DRS_ZENABLE, D3DZB_False);					


das geht bei mir nur so:
ausblenden Quelltext
1:
FDevice.SetRenderState(D3DRS_ZENABLE, Cardinal(D3DZB_False));					


Udontknow hat folgendes geschrieben:
ausblenden Quelltext
1:
FDevice.SetTransform(D3DTS_View, IdentityMatrix);					


das hab ich schon.

Udontknow hat folgendes geschrieben:
ausblenden Quelltext
1:
FDevice.SetTransform(D3DTS_World, IdentityMatrix);					


und das geht bei mir nicht, folgender fehler:
[Fehler] form_Main.pas(85): Inkompatible Typen: 'TD3DTransformStateType' und 'Integer'

den rest hab ich noch nicht ausprobiert, da es bei mir anscheinend an
viel früherer stelle mangelt.

Udontknow hat folgendes geschrieben:
[code]PS: Vielleicht liegt´s daran, daß du keine Lichtquelle hast?


ich glaube nicht, dass es daran liegt, weil ich in keinem anfängertutorial
bis jetzt irgendwo lichtquellen gefunden habe.

shadow.