| Autor |
Beitrag |
ShadowThief
      
Beiträge: 278
|
Verfasst: Mi 24.09.03 22:32
hallo,
ich hab ein problem bei meiner dirextX9-render methode,
hier ist sie:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| if Failed(D3DDevice.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 128, 0), 1.0, 0)) then Caption := 'device couldn''t be cleared. ';
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. ';
if D3DDevice.EndScene <> D3D_OK then Caption := 'screen couldn''t be ended. ';
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 
      
Beiträge: 278
|
Verfasst: 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 Tino: Überflüssige Absätze entfernt.
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
_________________ mfg.
mâximôv
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 278
|
Verfasst: 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:
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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 25.09.03 11:23
Deshalb schrieb ich ja auch "für normale Vertexshader".
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.
Werden transformierte Vertices nicht von der World-Transform-Matrix betroffen?
|
|
ShadowThief 
      
Beiträge: 278
|
Verfasst: Do 25.09.03 12:11
oh mann  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):
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 ...
shadow.
Moderiert von Tino: Überflüssige Beiträge entfernt.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 25.09.03 12:40
Hmmm. Ok. Da musst du dir noch ein bisschen Wissen aneignen.
Setze mal folgendes:
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:
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 
      
Beiträge: 278
|
Verfasst: Do 25.09.03 13:07
| Udontknow hat folgendes geschrieben: | Quelltext 1:
| FDevice.SetRenderState(D3DRS_ZENABLE, D3DZB_False); | |
das geht bei mir nur so:
Quelltext 1:
| FDevice.SetRenderState(D3DRS_ZENABLE, Cardinal(D3DZB_False)); |
| Udontknow hat folgendes geschrieben: | Quelltext 1:
| FDevice.SetTransform(D3DTS_View, IdentityMatrix); | |
das hab ich schon.
| Udontknow hat folgendes geschrieben: | 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.
|
|
|