Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Strided data in DX9

Iniciado por Pogacha, 28 de Enero de 2009, 06:49:44 PM

« anterior - próximo »

Pogacha

Eso se puede hacer strided data en D3D 9?
O sea cargar vectores paralelos en vez de un vertex buffer.

Pogacha

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?

davidgf

Qué quiere decir strided data?? Podrías explicarlo para tontos porfa?

Tàrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha

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 );

davidgf

#4
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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Pogacha

OK, entonces se puede creando diferentes streams, ... pero es necesario un shader para eso, o se puede usar la fixed pipeline en vez?


davidgf

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àrraco: una aventura por la Tarragona romana (http://tarraco.davidgf.net)

Prompt

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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.