Dibujar un triangulo

CepitaDelValle

Newbie Lvl 2
Gente estoy aprendiendo directx 8, entonces quiero dibujar mi primer triangulo pero no se muestra nada.
Ahi les dejo el codigo

Código:
Public run As Boolean
Public DirectX As DirectX8
Public DirectD3D As Direct3D8
Public DirectDevice As Direct3DDevice8
Public DirectD3D8 As D3DX8

Public Projection As D3DMATRIX
Public World As D3DMATRIX

Public DirecteVertexBuffer As Direct3DVertexBuffer8

Private Declare Sub CopyMemoryToAny Lib "kernel32.dll" _
  Alias "RtlMoveMemory" (ByRef Destination As Any, ByVal Source As Long, ByVal length As Long)

Private Type Vertex
     x As Single
     y As Single
     z As Single
     color As Long
End Type

Private Sub Init()
    Dim Puntero() As Byte
    Dim DispMode As D3DDISPLAYMODE
    Dim D3DWindow As D3DPRESENT_PARAMETERS

    Set DirectX = New DirectX8
    Set DirectD3D = DirectX.Direct3DCreate()
    
    'Call D3DXMatrixIdentity(Projection)
    Call D3DXMatrixIdentity(World)
    'Call D3DXMatrixOrthoLH(Projection, 1024, 768, -1, 1)
    Call D3DXMatrixOrthoOffCenterLH(Projection, 0, 1024#, 768#, 0, -1#, 1#)
    
    Dim vertices(2) As Vertex
    vertices(0).x = 125
    vertices(0).y = 50
    vertices(0).z = 0
    vertices(0).color = 223122
    
    vertices(1).x = 200
    vertices(1).y = 200
    vertices(1).z = 0
    vertices(1).color = 223122
    
    vertices(2).x = 50
    vertices(2).y = 200
    vertices(2).z = 0
    vertices(2).color = 223122
    
    Call DirectD3D.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DispMode)
    
    With D3DWindow
        .Windowed = True
        .SwapEffect = D3DSWAPEFFECT_DISCARD
        .hDeviceWindow = Form1.hWnd
        .BackBufferCount = 1
        .BackBufferFormat = DispMode.Format
        .BackBufferWidth = 1024
        .BackBufferHeight = 768
    End With
    
    
    Set DirectDevice = DirectD3D.CreateDevice(D3DADAPTER_DEFAULT, _
                                              D3DDEVTYPE_HAL, _
                                              Form1.hWnd, _
                                              D3DCREATE_SOFTWARE_VERTEXPROCESSING, _
                                              D3DWindow)
    

    
    Set DirecteVertexBuffer = DirectDevice.CreateVertexBuffer(16 * 3, D3DUSAGE_WRITEONLY, D3DFVF_XYZ Or D3DFVF_DIFFUSE, D3DPOOL_DEFAULT)
    Call D3DVertexBuffer8SetData(DirecteVertexBuffer, 0, 16 * 3, 0, vertices(0))
    
End Sub

Public Sub Main()
    Call Init

    run = True
    Form1.Show
    
    While (run)
            Call DirectDevice.Clear(0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0)
            Call DirectDevice.BeginScene
                Call DirectDevice.SetTransform(D3DTS_PROJECTION, Projection)
                Call DirectDevice.SetTransform(D3DTS_VIEW, World)
            
                Call DirectDevice.SetVertexShader(D3DFVF_XYZ Or D3DFVF_DIFFUSE)
            
                Call DirectDevice.SetStreamSource(0, DirecteVertexBuffer, 16)
                Call DirectDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1)
            Call DirectDevice.EndScene
            
            Call DirectDevice.Present(ByVal 0, ByVal 0, 0, ByVal 0)
        
        DoEvents
    Wend
    
    Set DirectDevice = Nothing
    Set DirectD3D = Nothing
End Sub
El formulario que uso es uno vacio, si se fijan en la foto se borra la pantalla pero como les dije no se dibuja mi triangulo :(
saludos!

 

Dr. Lord Fers

Legendario Inmortal Lvl 5
Miembro del equipo
Moderador
Moderador de Tecnología
Al utilizar una matriz de proyección ortogonal en fixed function, estás obligado a definir el componente Rhw (imagino que querés dibujar un triángulo 2D), entonces probá de la siguiente manera:

Private Type Vertex
x As Single
y As Single
z As Single
Rhw As Single
color As Long
End Type

En lugar de D3DFVF_XYZ sería D3DFVF_XYZRHW.

Y el Stride sería 20 obviamente.

Cuando definas cada vértice, agregás lo siguiente, Rhw siempre va en 1:
vertices(0).Rhw = 1
vertices(1).Rhw = 1
vertices(2).Rhw = 1

Saludos.
 

CepitaDelValle

Newbie Lvl 2
Al utilizar una matriz de proyección ortogonal en fixed function, estás obligado a definir el componente Rhw (imagino que querés dibujar un triángulo 2D), entonces probá de la siguiente manera:

Private Type Vertex
x As Single
y As Single
z As Single
Rhw As Single
color As Long
End Type

En lugar de D3DFVF_XYZ sería D3DFVF_XYZRHW.

Y el Stride sería 20 obviamente.

Cuando definas cada vértice, agregás lo siguiente, Rhw siempre va en 1:
vertices(0).Rhw = 1
vertices(1).Rhw = 1
vertices(2).Rhw = 1

Saludos.
Te amo kpo :D


Tengo otro duda por internet dicen que se tendria q usar D3DFVF_XYZ con
la funcion D3DXMatrixOrthoOffCenterLH para dibujar en 2d

o es mejor usar D3DFVF_XYZRHW para 2d?

edit: aun asi muchas gracias amigo 2 horas para poder dibujar ese puto triangulo jejej
 

Dr. Lord Fers

Legendario Inmortal Lvl 5
Miembro del equipo
Moderador
Moderador de Tecnología
Te amo kpo :D


Tengo otro duda por internet dicen que se tendria q usar D3DFVF_XYZ con
la funcion D3DXMatrixOrthoOffCenterLH para dibujar en 2d

o es mejor usar D3DFVF_XYZRHW para 2d?
Te conviene utilizarlo con el componente Rhw ya que te hace la corrección la GPU, sino en todo caso deberías realizar las correcciones de la transformación por tu cuenta, terminarías haciéndola todo en CPU (ineficiente) sólo por ahorrarte 1 componente por vértice, es decir, sólo 4 bytes (por ahorrar muy poca memoria, perdés mucha eficiencia). Eso podría ser útil en los 90s y comienzos de los 2000s cuando las memorias RAM eran caras, las aceleradoras 3D no eran tan potentes, y podías aprovechar el CPU sin avergonzarte, pero ahora eso no es así, las RAM son un regalo.

Aún así, te recomendaría que te metas con Direct3D 9 mínimamente, Direct3D 8 todavía tiene algunos problemas de diseño en su API y los drivers actuales van a darte mejor rendimiento con APIs más nuevas, el único inconveniente sería el lenguaje, ya que VB6 sólo tuvo un wrapper COM de DirectX hasta la versión 8.

Te lo comento como consejo, de cualquier manera, vos sabrás qué te conviene más para tus proyectos.

Saludos.
 

CepitaDelValle

Newbie Lvl 2
Te conviene utilizarlo con el componente Rhw ya que te hace la corrección la GPU, sino en todo caso deberías realizar las correcciones de la transformación por tu cuenta, terminarías haciéndola todo en CPU (ineficiente) sólo por ahorrarte 1 componente por vértice, es decir, sólo 4 bytes (por ahorrar muy poca memoria, perdés mucha eficiencia). Eso podría ser útil en los 90s y comienzos de los 2000s cuando las memorias RAM eran caras, las aceleradoras 3D no eran tan potentes, y podías aprovechar el CPU sin avergonzarte, pero ahora eso no es así, las RAM son un regalo.

Aún así, te recomendaría que te metas con Direct3D 9 mínimamente, Direct3D 8 todavía tiene algunos problemas de diseño en su API y los drivers actuales van a darte mejor rendimiento con APIs más nuevas, el único inconveniente sería el lenguaje, ya que VB6 sólo tuvo un wrapper COM de DirectX hasta la versión 8.

Te lo comento como consejo, de cualquier manera, vos sabrás qué te conviene más para tus proyectos.

Saludos.
Porque lo q me dices no hay una libreria directx 9 para vb, entonces como podria llamar a las funciones de dx9 en vb6?

aun asi creo q me voy a ponerme a aprender dx9! desde ya muchas gracias y disculpa si soy muy hincha pelotas
 

Dr. Lord Fers

Legendario Inmortal Lvl 5
Miembro del equipo
Moderador
Moderador de Tecnología
Porque lo q me dices no hay una libreria directx 9 para vb, entonces como podria llamar a las funciones de dx9 en vb6?

aun asi creo q me voy a ponerme a aprender dx9! desde ya muchas gracias y disculpa si soy muy hincha pelotas
Yo te diría que sigas con Direct3D 8 en VB6, pero trates de llevar la misma idea con Direct3D 9, que más o menos la API se comporta igual, si bien le faltan cosas muy importantes, calculo que para lo que vos vayas a utilizar de momento, te va a alcanzar. Pero si manejás otro lenguaje como .NET (VB o C#), o C/C++, entonces te lo recomendaría.

Saludos cordiales.
 

CepitaDelValle

Newbie Lvl 2
Yo te diría que sigas con Direct3D 8 en VB6, pero trates de llevar la misma idea con Direct3D 9, que más o menos la API se comporta igual, si bien le faltan cosas muy importantes, calculo que para lo que vos vayas a utilizar de momento, te va a alcanzar. Pero si manejás otro lenguaje como .NET (VB o C#), o C/C++, entonces te lo recomendaría.

Saludos cordiales.
se algo de c++(lo basico) pero voy a la segura y aprender dx8 con vb6.
Muchas gracias :D
 
Arriba