Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Pogacha en 28 de Enero de 2009, 06:49:44 PM

Título: Strided data in DX9
Publicado por: Pogacha en 28 de Enero de 2009, 06:49:44 PM
Eso se puede hacer strided data en D3D 9?
O sea cargar vectores paralelos en vez de un vertex buffer.
Título: Re: Strided data in DX9
Publicado por: Pogacha en 29 de Enero de 2009, 05:44:10 PM
mmmmmmmmmm.....

Al parecer nadie me quiere ... <=v(

En  una proxima vida seré mas bueno =vP

Se puede hacer eso con los streams o es malo tener streams dinamicos paralelos?
Título: Re: Strided data in DX9
Publicado por: davidgf en 29 de Enero de 2009, 11:16:15 PM
Qué quiere decir strided data?? Podrías explicarlo para tontos porfa?

Título: Re: Strided data in DX9
Publicado por: Pogacha en 30 de Enero de 2009, 02:05:41 AM
Strided data es como se trabaja en OpenGL y en directx7 ...
Eso te permite hacer Vertex formats mucho mas libres, o sea, tener vertexs formats compatibles tanto en OpenGL como DirectX

Un ejemplo que saco del sdk de directx 7:
D3DDRAWPRIMITIVESTRIDEDDATA g_StridedData;

// Assign the addresses of the various interleaved components
// to their corresponding strided members.
g_StridedData.position.lpvData          = &g_avWallVertices[24].x;
g_StridedData.diffuse.lpvData           = &g_avWallVertices[24].dwColor;
g_StridedData.textureCoords[0].lpvData  = &g_avWallVertices[24].tuBase;
g_StridedData.textureCoords[1].lpvData  = &g_avWallVertices[24].tuLightMap;
g_StridedData.position.dwStride         = sizeof(MTVERTEX);
g_StridedData.diffuse.dwStride          = sizeof(MTVERTEX);
g_StridedData.textureCoords[0].dwStride = sizeof(MTVERTEX);
g_StridedData.textureCoords[1].dwStride = sizeof(MTVERTEX);

// Render the vertices with multiple texture blending (Modulate).
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_pd3dDevice->SetTexture( 0, g_BaseTextureMap);
g_pd3dDevice->SetTexture( 1, g_LightMap);
g_pd3dDevice->DrawPrimitiveStrided( D3DPT_TRIANGLELIST,
                        D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX2,
                        &g_StridedData, 12, NULL );
Título: Re: Strided data in DX9
Publicado por: davidgf en 01 de Febrero de 2009, 09:13:29 PM
SI lo he entendido bien quieres tener varios buffers (uno de vertices, otro de normales, otro de coordenadas de textura...) y poder enviarlos como en opengl con las funciones gl*Pointer no?? Yo hice algo así pero diría que usaba shaders... te pego el código en VB, hace un par de años así que ni idea de cómo apareció ahí. xD Aviso que es DX8!

Para crear y "bindear" los buffers...


    Set VertexBuffer = Device.CreateVertexBuffer(NumVertices * 12, D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_MANAGED)
    Set UVBuffer = Device.CreateVertexBuffer(NumVertices * 8, D3DUSAGE_WRITEONLY, D3DFVF_TEX1, D3DPOOL_MANAGED)
    Set Indexbuffer = Device.CreateIndexBuffer(NumFaces * 12, D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_MANAGED)

    D3DVertexBuffer8SetData VertexBuffer, 0, NumVertices * 12, 0, vertices(0)
    D3DVertexBuffer8SetData UVBuffer, 0, NumVertices * 8, 0, uvcoords(0)
    D3DIndexBuffer8SetData Indexbuffer, 0, NumFaces * 12, 0, indices(0)

 
    Device.SetStreamSource 0, VertexBuffer, 12    'buffer 0, vertices
    Device.SetStreamSource 1, UVBuffer, 8    'buffer 1 , coord tex
    Device.SetMaterial EmptyMaterial

    Device.SetVertexShader CharShader


El CharShader que uso es este de aqui...


Public Sub CreateVertexSahders()

If VSCapable = False Then Exit Sub

Dim decl(5) As Long

decl(0) = D3DVSD_STREAM(0)     ' buffer 0
decl(1) = D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3)   ' vertices
decl(2) = D3DVSD_STREAM(1)    'buffer 1
decl(3) = D3DVSD_REG(D3DVSDE_TEXCOORD0, D3DVSDT_FLOAT2)   'coordenadas de textura
decl(4) = D3DVSD_END()
Call Device.CreateVertexShader(decl(0), ByVal 0, CharShader, 0)
End Sub

Public Sub ReleaseVertexShaders()
If VSCapable = False Then Exit Sub
Device.DeleteVertexShader CharShader
End Sub


Todas las constantes o funciones de shader esas raras las saque de un .BAS de microsoft de unos ejemplos de DX8 me parece... pero deberían funcionar bien en DX9 no??

Como ves tengo un buffer de vertices, de coordenadas de textura y de índices, separados.

Saludos!!
Título: Re: Strided data in DX9
Publicado por: Pogacha en 02 de Febrero de 2009, 12:40:14 PM
OK, entonces se puede creando diferentes streams, ... pero es necesario un shader para eso, o se puede usar la fixed pipeline en vez?

Título: Re: Strided data in DX9
Publicado por: davidgf en 02 de Febrero de 2009, 04:26:54 PM
Parece que sí, aunque es muy extraño verdad? No tengo ni idea de shaders de DX8 pero parecen muy extraños, ya que les indicas de donde coges los datos.
En Opengl es mucho más práctico, bindeas el buffer ya sea de un VBO, o de donde sea y él lo hace todo por ti verdad? No se, espero que algun alma bondadosa nos ilumine!

Saludos!
Título: Re: Strided data in DX9
Publicado por: Prompt en 03 de Febrero de 2009, 08:54:45 AM
Que me digan lo que quieran!

"JOOOOOOOOORDER! que feo es el ****** DirectX" La estructura está bien, el tema OOP está perfecto, pero por dios que usen en microsoft un libro editado por uno de ellos, Code Complete.

Eso es Coding Horror!! en toda regla :P

Pogacha, todo se puede hacer por fixed pipelines hoy en día. Quizás algún dia no muy lejano, como en OpenGL 3.0 quiten la mayoría de las cosas por fin. Ya que el fixed pipelines es algo directo, pero satura el BUS de datos hacia la GPU.