Eso se puede hacer strided data en D3D 9?
O sea cargar vectores paralelos en vez de un vertex buffer.
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?
Qué quiere decir strided data?? Podrías explicarlo para tontos porfa?
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 );
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!!
OK, entonces se puede creando diferentes streams, ... pero es necesario un shader para eso, o se puede usar la fixed pipeline en vez?
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!
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.