Hi again, I have got another newbie problem (easier this time, I hope)

Started by
2 comments, last by LinkOfTime 19 years, 8 months ago
Hi all This time I have managed to draw a square in DX8 but I am having some hard time coloring it in different colors. It always stays red... Well, here is the code, I hope someone can tell me what my mistake is: Thanks.
Dim DX As DirectX8
Dim D3D As Direct3D8
Dim D3DD As Direct3DDevice8
Dim D3DDP As D3DPRESENT_PARAMETERS
Dim D3DX As D3DX8
Dim Texture As Direct3DTexture8
Dim Vertices(·po··po·3·pc··pc·) As VertexType
Private Type VertexType
   X As Single
   Y As Single
   Z As Single
   Color As Long
   rhw As Single
   specular As Long
   tu As Single
   tv As Single
End Type
Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
Dim b As Boolean

Private Sub Load_DX()
   Set DX = New DirectX8
   Set D3D = DX.Direct3DCreate
   Set D3DX = New D3DX8
   D3DDP.SwapEffect = D3DSWAPEFFECT_FLIP
   D3DDP.BackBufferCount = ·po··po·1·pc··pc·
   D3DDP.BackBufferFormat = D3DFMT_R5G6B5
   D3DDP.BackBufferWidth = ·po··po·800·pc··pc·
   D3DDP.BackBufferHeight = ·po··po·600·pc··pc·
   Set D3DD = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Form1.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DDP)
   'Set Texture = D3DX.CreateTextureFromFile(D3DD, App.Path & "\pic.bmp")
   D3DD.SetRenderState D3DRS_LIGHTING, False
   D3DD.SetVertexShader FVF
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
End
End Sub

Private Sub Reset_DX()
   Vertices(·po··po·0·pc··pc·) = Load_Vertex(·po··po·100·pc··pc·, ·po··po·100·pc··pc·, RGB(·po··po·255·pc··pc·, ·po··po·0·pc··pc·, ·po··po·255·pc··pc·))
   Vertices(·po··po·1·pc··pc·) = Load_Vertex(·po··po·200·pc··pc·, ·po··po·100·pc··pc·, RGB(·po··po·255·pc··pc·, ·po··po·0·pc··pc·, ·po··po·0·pc··pc·))
   Vertices(·po··po·2·pc··pc·) = Load_Vertex(·po··po·200·pc··pc·, ·po··po·200·pc··pc·, RGB(·po··po·0·pc··pc·, ·po··po·0·pc··pc·, ·po··po·255·pc··pc·))
   Vertices(·po··po·3·pc··pc·) = Load_Vertex(·po··po·100·pc··pc·, ·po··po·200·pc··pc·, RGB(·po··po·255·pc··pc·, ·po··po·0·pc··pc·, ·po··po·0·pc··pc·))
End Sub

Private Function Load_Vertex(X As Single, Y As Single, Color As Long) As VertexType
   Load_Vertex.X = X
   Load_Vertex.Y = Y
   Load_Vertex.Z = ·po··po·0·pc··pc·
   Load_Vertex.rhw = ·po··po·1·pc··pc·
   Load_Vertex.Color = Color
   Load_Vertex.specular = ·po··po·0·pc··pc·
   Load_Vertex.tu = ·po··po·0·pc··pc·
   Load_Vertex.tv = ·po··po·0·pc··pc·
End Function

Private Sub Play_DX()
   D3DD.Clear ·po··po·0·pc··pc·, ByVal ·po··po·0·pc··pc·, D3DCLEAR_TARGET, RGB(·po··po·255·pc··pc·, ·po··po·0·pc··pc·, ·po··po·0·pc··pc·), ·po··po·1·pc··pc·, ·po··po·0·pc··pc·
   D3DD.BeginScene
      D3DD.DrawPrimitiveUP D3DPT_TRIANGLEFAN, ·po··po·2·pc··pc·, Vertices(·po··po·0·pc··pc·), Len(Vertices(·po··po·0·pc··pc·))
   D3DD.EndScene
   D3DD.Present ByVal ·po··po·0·pc··pc·, ByVal ·po··po·0·pc··pc·, ·po··po·0·pc··pc·, ByVal ·po··po·0·pc··pc·
End Sub

Private Sub Form_Load()
   b = False
   Load_DX
   Reset_DX
   While b = False
      Play_DX
      DoEvents
   Wend
End Sub

Private Sub Timer1_Timer()
   b = True
End Sub

Don''t have one, sorry.
Advertisement
Do you actually see the rectangle or square itself, or is the whole screen or window actually red? Because you clear the render target to red, so the whole window should be red. Then the rectangle should draw on top of the red background, if all is working well. Try changing your D3DD.Clear color to something other than red; if it changes the results, then you know that you're not actually seeing your rectangle, just the background.

Another thing, order of items in VertexType matters, and you appear to have a few things out of order. I believe it should be more like this:
Private Type VertexType   X As Single   Y As Single   Z As Single   rhw As Single   tu As Single   tv As Single   Color As Long   specular As LongEnd Type
Otherwise, DirectX will be trying to read your Color value as if it were rhw, etc.

And you might need to set the texture stage states. I don't know what they default to, but it could be useful to do so. I don't use VB for DX, but I'm guessing it'd look like this:
D3DD.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);D3DD.SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);D3DD.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE  );D3DD.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE  );D3DD.SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);D3DD.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE  );D3DD.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE  );D3DD.SetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_DISABLE );D3DD.SetTextureStageState(1, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );
"We should have a great fewer disputes in the world if words were taken for what they are, the signs of our ideas only, and not for things themselves." - John Locke
Hi again
Thanks for the help. I am going to be a bit more specific with my explanation. Although I format the background to the color of red, it appears all blue. The square (which I can see in the correct coordinates) appears in a red color. Now, I tried to change the order of the VertexType just like you said and the square now appears in black.
Well, I am beginning to understand that the problem comes from the order of the VertexType declaration, but if any one finds how to fix the problem, please send me a response.

P.S: Here is the code as it looks now, after the changes:
Dim DX As DirectX8Dim D3D As Direct3D8Dim D3DD As Direct3DDevice8Dim D3DDP As D3DPRESENT_PARAMETERSDim D3DX As D3DX8Dim Texture As Direct3DTexture8Dim Vertices(·po·3·pc·) As VertexTypePrivate Type VertexType   X As Single   Y As Single   Z As Single   rhw As Single   tu As Single   tv As Single   Color As Long   specular As LongEnd TypeConst FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULARDim b As BooleanPrivate Sub Load_DX()   Set DX = New DirectX8   Set D3D = DX.Direct3DCreate   Set D3DX = New D3DX8   D3DDP.SwapEffect = D3DSWAPEFFECT_FLIP   D3DDP.BackBufferCount = ·po·1·pc·   D3DDP.BackBufferFormat = D3DFMT_R5G6B5   D3DDP.BackBufferWidth = ·po·800·pc·   D3DDP.BackBufferHeight = ·po·600·pc·   Set D3DD = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Form1.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DDP)   'Set Texture = D3DX.CreateTextureFromFile(D3DD, App.Path & "\pic.bmp")   D3DD.SetRenderState D3DRS_LIGHTING, False   D3DD.SetVertexShader FVFEnd SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)EndEnd SubPrivate Sub Reset_DX()   Vertices(·po·0·pc·) = Load_Vertex(·po·100·pc·, ·po·100·pc·, RGB(·po·255·pc·, ·po·0·pc·, ·po·255·pc·))   Vertices(·po·1·pc·) = Load_Vertex(·po·200·pc·, ·po·100·pc·, RGB(·po·255·pc·, ·po·0·pc·, ·po·0·pc·))   Vertices(·po·2·pc·) = Load_Vertex(·po·200·pc·, ·po·200·pc·, RGB(·po·0·pc·, ·po·0·pc·, ·po·255·pc·))   Vertices(·po·3·pc·) = Load_Vertex(·po·100·pc·, ·po·200·pc·, RGB(·po·255·pc·, ·po·0·pc·, ·po·0·pc·))End SubPrivate Function Load_Vertex(X As Single, Y As Single, Color As Long) As VertexType   Load_Vertex.X = X   Load_Vertex.Y = Y   Load_Vertex.Z = ·po·0·pc·   Load_Vertex.rhw = ·po·1·pc·   Load_Vertex.Color = Color   Load_Vertex.specular = ·po·0·pc·   Load_Vertex.tu = ·po·0·pc·   Load_Vertex.tv = ·po·0·pc·End FunctionPrivate Sub Play_DX()   D3DD.Clear ·po·0·pc·, ByVal ·po·0·pc·, D3DCLEAR_TARGET, RGB(·po·255·pc·, ·po·0·pc·, ·po·0·pc·), ·po·1·pc·, ·po·0·pc·   D3DD.BeginScene      D3DD.DrawPrimitiveUP D3DPT_TRIANGLEFAN, ·po·2·pc·, Vertices(·po·0·pc·), Len(Vertices(·po·0·pc·))   D3DD.EndScene   D3DD.Present ByVal ·po·0·pc·, ByVal ·po·0·pc·, ·po·0·pc·, ByVal ·po·0·pc·End SubPrivate Sub Form_Load()   b = False   Load_DX   Reset_DX   While b = False      Play_DX      DoEvents   WendEnd SubPrivate Sub Timer1_Timer()   b = TrueEnd Sub
Don''t have one, sorry.
Ok, solved it. Thanks for the help AGONY. It was one of the things you said.
Well, thanks again and bye :)
Don''t have one, sorry.

This topic is closed to new replies.

Advertisement