.[ ČeskéHry.cz ].
Chybny rendering z OBJ
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 17. říjen 2012, 15:59:14    Předmět: Chybny rendering z OBJ Odpovědět s citátem

Pokracujem na svojom directx 9" engine" a mam problem z OBJ suborom.

Teraz pouzivam ako zdroj dat upraveny obj subor
    v -0.500000 -0.500000 0.500000
    v 0.500000 -0.500000 0.500000
    v -0.500000 0.500000 0.500000
    v 0.500000 0.500000 0.500000
    v -0.500000 0.500000 -0.500000
    v 0.500000 0.500000 -0.500000
    v -0.500000 -0.500000 -0.500000
    v 0.500000 -0.500000 -0.500000

    f 1/1/1 2/2/2 3/3/3
    f 3/3/3 2/2/2 4/4/4
    f 3/13/5 4/14/6 5/15/7
    f 5/15/7 4/14/6 6/16/8
    f 5/21/9 6/22/10 7/23/11
    f 7/23/11 6/22/10 8/24/12
    f 7/17/13 8/18/14 1/19/15
    f 1/19/15 8/18/14 2/20/16
    f 2/5/17 8/6/18 4/7/19
    f 4/7/19 8/6/18 6/8/20
    f 7/9/21 1/10/22 5/11/23
    f 5/11/23 1/10/22 3/12/24

Deklaracia vertexu
kód:
struct FVF_CUSTOMVERTEX
{
    D3DXVECTOR3 position;
    //D3DXVECTOR3 normal;
    //D3DXVECTOR2 texcoord;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ ) // | D3DFVF_NORMAL |  D3DFVF_TEX1 )

cast kodu pomocov ktorej nacitam index buffer
kód:

         if (!strncmp(cBuffer, "f ", 2)) // Face - tvar
         {    
            VERTEX_TEXTURE_NORMAL vtn;
            int a = 0;
            memset(&vtn,-1,sizeof(VERTEX_TEXTURE_NORMAL));
            sscanf(cBuffer+2,"%i/%i/%i %i/%i/%i %i/%i/%i %i/%i/%i",&vtn.f_v[0],&vtn.f_vt[0],&vtn.f_vn[0],
                                                      &vtn.f_v[1],&vtn.f_vt[1],&vtn.f_vn[1],
                                                      &vtn.f_v[2],&vtn.f_vt[2],&vtn.f_vn[2],
                                                      &vtn.f_v[3],&vtn.f_vt[3],&vtn.f_vn[3]);
            while(true)
            {
               if(vtn.f_v[a]==-1)
                  break;
               else
               {
                  f_v.push_back(vtn.f_v[a]-1);
                  //f_vtexture.push_back(vtn.f_vt[a]-1);
                  //f_vnormal.push_back(vtn.f_vn[a]-1);
               }
               a++;
            }


Tu je kod pomocou ktoreho plnim vertex a index buffer.
kód:
      HRESULT HR;
      //fill vertex buffer
      HR = d3dDevice->CreateVertexBuffer(sizeof(D3DXVECTOR3)*VertexPosition.size(),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pModel.VertexPositionsBuffer,NULL);
      if(HR) errMan->Error("Vertex buffer not created!");
      VOID *pVertex;
      HR = pModel.VertexPositionsBuffer->Lock(0,sizeof(D3DXVECTOR3)*VertexPosition.size(),&pVertex,0);
      if(HR) errMan->Error("pModel.VertexPositionsBuffer->Lock(0,sizeof(D3DXVECTOR3)*VertexPosition.size(),&pVertex,0);");
      memcpy(pVertex,&VertexPosition.at(0),sizeof(D3DXVECTOR3)*VertexPosition.size());
      HR = pModel.VertexPositionsBuffer->Unlock();
      if(HR) errMan->Error("HR = pModel.VertexPositionsBuffer->Unlock();");
      pModel.nrVertices=VertexPosition.size();
      // fill index buffer
      HR = d3dDevice->CreateIndexBuffer(sizeof(int)*f_v.size(),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&pModel.IndexBuffer,NULL);
      if(HR) errMan->Error("Index buffer not created!");
      HR = pModel.IndexBuffer->Lock(0,sizeof(int)*f_v.size(),&pVertex,0);
      if(HR) errMan->Error("pModel.IndexBuffer->Lock(0,sizeof(int)*f_v.size(),&pVertex,0);");
      memcpy(pVertex,&f_v.at(0),sizeof(int)*f_v.size());
      HR = pModel.IndexBuffer->Unlock();
      pModel.nrIndices=f_v.size();

a tu je kod z renderovania
kód:
   hr = videoMan->vs->d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET |D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,127),1.0F,0L);
   hr = videoMan->vs->d3dDevice->BeginScene();
   for(int b = 0; b < modelMan->mesh.size(); b++)
   {
/*      D3DXMatrixTranslation(&this->kamera->world,
         modelMan->mesh.at(b).poloha.x,0.0f,
         modelMan->mesh.at(b).poloha.z); //dolozit suradnice mesh-u
      hr = videoMan->vs->d3dDevice->SetTransform(D3DTS_WORLD, &this->kamera->world);
*/      if(modelMan->mesh.at(b).MeshType==1)
      { // X mesh
         for(DWORD a = 0; a < modelMan->mesh.at(b).pMeshMaterialsA.size(); a++ )
         {
            hr = videoMan->vs->d3dDevice->SetMaterial( &modelMan->mesh.at(b).pMeshMaterialsA.at(a));
            hr = videoMan->vs->d3dDevice->SetTexture(0, modelMan->mesh.at(b).pMeshTexturesA.at(a));
            if(!SHUTDOWN)hr = modelMan->mesh.at(b).dxMesh->DrawSubset(a);
         }
      }
      else
      { // OBJ mesh
         hr = videoMan->vs->d3dDevice->SetStreamSource(0,modelMan->mesh.at(b).model.VertexPositionsBuffer,0,sizeof(D3DXVECTOR3));
         hr = videoMan->vs->d3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX);
         hr = videoMan->vs->d3dDevice->SetIndices(modelMan->mesh.at(b).model.IndexBuffer);
         if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,modelMan->mesh.at(b).model.nrVertices-1,0,modelMan->mesh.at(b).model.nrIndices/3);
         //if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,modelMan->mesh.at(b).model.nrVertices);
      }
   }
   this->DrawOverModel(0);
   this->DrawTexts();
   videoMan->vs->d3dDevice->EndScene();
   videoMan->vs->d3dDevice->Present( NULL,NULL,NULL,NULL);

Uz zopar dni sa neviem dopracovat ku spravnemu vysledku. Momentalne mi funkcia kresli 1 trojuholnik(viditelny) ale vypada byt zlozeny z nahodnych bodov.
Je pravdepodobne ze som zle pochopil ako sa nacitava index z obj suboru a ako ho spracovat v dx api.
Ked zapnem funkciu DrawPrimitive(D3DPT_POINTLIST,..... tak sa zobrazi aj zlozity objekt a vypada byt v poriadku.vtn.f_vt;
pModel.nrVertices=VertexPosition.size // X mesh
for
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 17. říjen 2012, 16:42:02    Předmět: Odpovědět s citátem

Tak som prisiel na prvu mensiu chybu.

toto pouzivam na naplnenie vertex bufferu
kód:
vector <D3DXVECTOR3> VertexPosition;

asi by som mal pouzit vector <FVF_CUSTOMVERTEX> VertexPosition;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 17. říjen 2012, 19:59:23    Předmět: Odpovědět s citátem

Zhuleny napsal:
Tak som prisiel na prvu mensiu chybu.

toto pouzivam na naplnenie vertex bufferu
kód:
vector <D3DXVECTOR3> VertexPosition;

asi by som mal pouzit vector <FVF_CUSTOMVERTEX> VertexPosition;

No vzledem k tomu, že FVF_CUSTOMVERTEX ti pouze zaobaluje D3DXVECTOR3, neřekl bych, že ti to nějak pomůže.
Nevím, d3d vypadá opravdu dost ošklivě (nechci rozjíždět flamewar, ale asi už se stalo Smile. Nemůže být problém v tom index bufferu? Máš D3DFMT_INDEX16, ale tvůj index je z intů (=32 bit). Zkus unsigned short místo int.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 17. říjen 2012, 20:37:39    Předmět: Odpovědět s citátem

mar ja sa z teba .....
DAKUJEM

Cumim na ten kod uz 4 dni, prepisal som uz vsetko mozne, a chyba je v blbom definovani index bufferu....

Vazne dakujem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 18. říjen 2012, 14:21:44    Předmět: Odpovědět s citátem

Nechce sa mi verit, ze si od DX nedostal ziaden error do Output Window. Ked si posunies treshold Error Outputu na polovicu, tak v tomto konkretnompripade dostanes aj hlasku, ze pchas iny pocet Bytes do bufferu nez si alokoval.

Dufam, ze mas zapnute DX Debug kniznice, bez nich je development ruska ruleta !

XNA ti v tomto pripade garantovane vyhodi exception. DX ti minimalne vyhodi HRESULT error.

Ktory ocividne nesledujes - inak by ti zistenie problemu zabralo 4 minuty a nie 4 dni Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 19. říjen 2012, 14:44:28    Předmět: Odpovědět s citátem

Mozno sa ti to nezda VladR ale hr si sledujem, mam zapnutu debug verziu dx, ale hlasil mi len ze mi nesedi pocet vertexov, alebo indexov. ale pri vytvarani bufferu nebola ziadna hlaska. Mozno este nieco nemam zapnute tak sa idem pozriet co sa da este zapnut na debug.


Teraz mam ale dalsi problem.
[img]www.penzionorava.eu/predaj/chybamodelu.png[/img]

Model mam z tejto stranky http://www.reinerstilesets.de/3d-grafiken/3d-character/ je to Guard, hned druhy.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 19. říjen 2012, 15:12:06    Předmět: Odpovědět s citátem

Zhuleny napsal:
Teraz mam ale dalsi problem.
[img]www.penzionorava.eu/predaj/chybamodelu.png[/img]

Model mam z tejto stranky http://www.reinerstilesets.de/3d-grafiken/3d-character/ je to Guard, hned druhy.

Nemůže to být tím, že to kreslíš jako triangle list, ale když má face 4 vrcholy, tak tam máš jenom 4 indexy místo 6ti?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 19. říjen 2012, 15:18:44    Předmět: Odpovědět s citátem

Zabudol som uviest este
kód:
if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,modelMan->mesh.at(b).model.nrVertices,0,modelMan->mesh.at(b).model.nrIndices-2);


TRIANGLELIST ROBIL ovela vacsie chyby.

Ale co som pochopil tak mesh z texturov sa neda renderovat pomocov indexu, tak teraz pracujem na kode ktory mi vytvory vertexy z f parametrov.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 19. říjen 2012, 15:35:53    Předmět: Odpovědět s citátem

Zhuleny napsal:
Zabudol som uviest este
kód:
if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,modelMan->mesh.at(b).model.nrVertices,0,modelMan->mesh.at(b).model.nrIndices-2);


TRIANGLELIST ROBIL ovela vacsie chyby.

Ale co som pochopil tak mesh z texturov sa neda renderovat pomocov indexu, tak teraz pracujem na kode ktory mi vytvory vertexy z f parametrov.

No dá se renderovat dokud tu texturu nezměníš, ale to přece nesouvisí s indexy?
A to ti funguje pokud to renderuješ jako triangle strip? To si sám děláš přeskládání na stripy? Z toho kódu to nevypadá...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 19. říjen 2012, 15:59:12    Předmět: Odpovědět s citátem

Samozrejme som to neprekladal, ale renderovat to renderovalo Very Happy ale hrozne.
Toto je moj prvy pokus o nacitanie OBJ a renderovanie.

Mozes mi teoreticky vysvetlit ako mesh v ktorom je iny pocet uv koordinatov ako vertexov renderovat cez drawindexedprimitive? nenasiel som na internete doposial ziadne vysvetlenie ak oto urobit.

Teraz som pokusne nacital vertexy a texture coords, a potom som vytvoril nove pole do ktoreho som ulozil udaje z indexu vo f riadkoch. vysledok o5 nic moc :/
Render prebieha pomocov drawprimitive a trianglestrip.

edit: Este chcem povedat ze kocku ktora je uvedena v prvom poste, mi uz renderovalo bezchybne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 19. říjen 2012, 16:10:42    Předmět: Odpovědět s citátem

Zhuleny napsal:
Mozes mi teoreticky vysvetlit ako mesh v ktorom je iny pocet uv koordinatov ako vertexov renderovat cez drawindexedprimitive? nenasiel som na internete doposial ziadne vysvetlenie ak oto urobit.

No pokud vím, tak tohle ani nejde. Takže si to budeš muset rozbalit tak, aby každý vertex měl u sebe i uv.
EDIT: opět to ale nesouvisí s indexy

Zhuleny napsal:

Teraz som pokusne nacital vertexy a texture coords, a potom som vytvoril nove pole do ktoreho som ulozil udaje z indexu vo f riadkoch. vysledok o5 nic moc :/
Render prebieha pomocov drawprimitive a trianglestrip.

edit: Este chcem povedat ze kocku ktora je uvedena v prvom poste, mi uz renderovalo bezchybne.

Můžeš postnout nový kód?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 19. říjen 2012, 16:33:31    Předmět: Odpovědět s citátem

toto je trieda pomocov ktorej sa pokusam nacitat obj

kód:
// ver 0.2

#include <vector>
#include <stdio.h>
using namespace std;
struct MODEL
{
   IDirect3DVertexBuffer9      *VertexPositionsBuffer;   // Models vertex buffer
   IDirect3DIndexBuffer9      *IndexBuffer;   // Models index buffer
   unsigned int   nrVertices;
   unsigned int   nrIndices;
   IDirect3DVertexBuffer9      *testVertexBuffer;   // Models vertex buffer
   unsigned int   testnrVertices;
   //IDirect3DIndexBuffer9      *testIndexBuffer;   // Models index buffer
};
struct FVF_CUSTOMVERTEX
{
    D3DXVECTOR3 position;
   // D3DXVECTOR3 normal;
    D3DXVECTOR2 texcoord;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ |  D3DFVF_TEX1)// | D3DFVF_NORMAL |  D3DFVF_TEX1 )
struct VERTEX_TEXTURE_NORMAL
{
   int f_v[5];
   int f_vt[5];
   int f_vn[5];
};
class CObjMeshLoader
{
public:
   CObjMeshLoader(char *cName,LPDIRECT3DDEVICE9 Device,MODEL& pModel);
   ~CObjMeshLoader();
private:
   void FillVertexPositionBuffer(D3DXVECTOR3 dxv){VertexPosition.push_back(dxv);};
   void FillVertexNormalBuffer(D3DXVECTOR3 dxv){VertexNormal.push_back(dxv);};
   void FillTextureCoordinateBuff(D3DXVECTOR2 tc){TextureCoordination.push_back(tc);};
   vector <D3DXVECTOR3> VertexPosition;
   vector <D3DXVECTOR2> TextureCoordination;
   vector <D3DXVECTOR3> VertexNormal;
   vector <int> f_v;
   vector <int> f_vtexture;
   vector <int> f_vnormal;
   char MaterialLib[20];
   LPDIRECT3DDEVICE9   d3dDevice;
   vector <FVF_CUSTOMVERTEX> Vertex;
};
CObjMeshLoader::CObjMeshLoader(char *cName,LPDIRECT3DDEVICE9 Device,MODEL& pModel)
{
   errMan->Oblast("CObjMeshLoader::CObjMeshLoader(char *cName,LPDIRECT3DDEVICE9 Device,MODEL& pModel)");
   d3dDevice = Device;
   char cBuffer[256];
   FILE *subor = fopen(cName, "r");
   if (subor)
   {
      while (fgets(cBuffer, 256, subor))
      {
         if (!strncmp(cBuffer, "v ", 2)) // Geometric vertices - geometrické vrcholy
         {
            float x,y,z;
            sscanf(cBuffer+2, "%f %f %f", &x, &y, &z);
            this->FillVertexPositionBuffer(D3DXVECTOR3(x,y,z));
         }
         if (!strncmp(cBuffer, "vt ", 2)) // Texture vertices - vrcholy textúry
         {
            float u,v;
            sscanf(cBuffer+2,"%f %f",&u,&v);
            this->FillTextureCoordinateBuff(D3DXVECTOR2(u,v));
         }
         if (!strncmp(cBuffer, "vp ", 2)) // Parameter space vertices -
         {
         }
         if (!strncmp(cBuffer, "vn ", 2)) // Vertex normals -
         {
            float x,y,z;
            sscanf(cBuffer+2, "%f %f %f", &x,&y,&z);
            this->FillVertexNormalBuffer(D3DXVECTOR3(x,y,z));
         }
         if (!strncmp(cBuffer, "f ", 2)) // Face - tvar
         {    
            VERTEX_TEXTURE_NORMAL vtn;
            int a = 0;
            memset(&vtn,-1,sizeof(VERTEX_TEXTURE_NORMAL));
            /*
            Test for numbers to read and define what kind of f format is in use
            //TODO optimize code
            */
            int test = sscanf(cBuffer+2,"%i/%i/%i",&vtn.f_v[0],&vtn.f_vt[0],&vtn.f_vn[0]);
            if(test==2)
            { //f v/vt v/vt v/vt v/vt
               sscanf(cBuffer+2, "%i/%i %i/%i %i/%i %i/%i",&vtn.f_v[0], &vtn.f_vt[0],
               &vtn.f_v[1], &vtn.f_vt[1],
               &vtn.f_v[2], &vtn.f_vt[2],
               &vtn.f_v[3], &vtn.f_vt[3]);
               while(true)
               {
                  if(vtn.f_v[a]==-1)
                     break;
                  else
                  {
                     f_v.push_back(vtn.f_v[a]-1);
                     f_vtexture.push_back(vtn.f_vt[a]-1);
                     // pokus
                     FVF_CUSTOMVERTEX vertx;
                     vertx.position=VertexPosition.at(vtn.f_v[a]-1);
                     vertx.texcoord=TextureCoordination.at(vtn.f_vt[a]-1);
                     Vertex.push_back(vertx);
                  }
                  a++;
               }
            }
            if(test==1)
            {
               int test2 = sscanf(cBuffer+2,"%i %i %i %i",&vtn.f_v[0], &vtn.f_v[1],&vtn.f_v[2],&vtn.f_v[3]);
               if(test2==1)
               {//f v//vn v//vn v//vn v//vn
                  sscanf(cBuffer+2, "%i//%i %i//%i %i//%i %i//%i ",&vtn.f_v[0],&vtn.f_vn[0],
                                                   &vtn.f_v[1],&vtn.f_vn[1],
                                                   &vtn.f_v[2],&vtn.f_vn[2],
                                                   &vtn.f_v[3],&vtn.f_vn[3]);
                  while(true)
                  {
                     if(vtn.f_v[a]==-1)
                        break;
                     else
                     {
                        f_v.push_back(vtn.f_v[a]-1);
                        f_vnormal.push_back(vtn.f_vn[a]-1);
                     }
                     a++;
                  }
               }
               else
               while(true)
               { //f v v v v
                  if(vtn.f_v[a]==-1) break;
                  else
                  {
                     f_v.push_back(vtn.f_v[a]-1);
                  }
                  a++;
               }
            }
            if(test==3)
            {
               //f v/vt/vn v/vt/vn v/vt/vn v/vt/vn
               sscanf(cBuffer+2,"%i/%i/%i %i/%i/%i %i/%i/%i %i/%i/%i",&vtn.f_v[0],&vtn.f_vt[0],&vtn.f_vn[0],
                                                      &vtn.f_v[1],&vtn.f_vt[1],&vtn.f_vn[1],
                                                      &vtn.f_v[2],&vtn.f_vt[2],&vtn.f_vn[2],
                                                      &vtn.f_v[3],&vtn.f_vt[3],&vtn.f_vn[3]);
               while(true)
               {
                  if(vtn.f_v[a]==-1)
                     break;
                  else
                  {
                     f_v.push_back(vtn.f_v[a]-1);
                     f_vtexture.push_back(vtn.f_vt[a]-1);
                     f_vnormal.push_back(vtn.f_vn[a]-1);
                  }
                  a++;
               }
            }
         }
         if (!strncmp(cBuffer, "mtllib ",6))
         {
            sscanf(cBuffer+6,"%s",&MaterialLib);
         }
      }
      fclose(subor);
      HRESULT HR;
      HR = d3dDevice->CreateVertexBuffer(sizeof(FVF_CUSTOMVERTEX)*Vertex.size(),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pModel.testVertexBuffer,NULL);
      VOID *pVertex;
      HR = pModel.testVertexBuffer->Lock(0,sizeof(FVF_CUSTOMVERTEX)*Vertex.size(),&pVertex,0);
      memcpy(pVertex,&Vertex.at(0),sizeof(FVF_CUSTOMVERTEX)*Vertex.size());
      HR = pModel.testVertexBuffer->Unlock();
      pModel.testnrVertices=Vertex.size();
      //fill vertex buffer
      /*
      HR = d3dDevice->CreateVertexBuffer(sizeof(FVF_CUSTOMVERTEX)*VertexPosition.size(),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pModel.VertexPositionsBuffer,NULL);
      if(HR) errMan->Error("Vertex buffer not created!");
      VOID *pVertex;
      HR = pModel.VertexPositionsBuffer->Lock(0,sizeof(D3DXVECTOR3)*VertexPosition.size(),&pVertex,0);
      if(HR) errMan->Error("pModel.VertexPositionsBuffer->Lock(0,sizeof(D3DXVECTOR3)*VertexPosition.size(),&pVertex,0);");
      memcpy(pVertex,&VertexPosition.at(0),sizeof(D3DXVECTOR3)*VertexPosition.size());
      HR = pModel.VertexPositionsBuffer->Unlock();
      if(HR) errMan->Error("HR = pModel.VertexPositionsBuffer->Unlock();");
      pModel.nrVertices=VertexPosition.size();
      */
      // fill index buffer
      HR = d3dDevice->CreateIndexBuffer(sizeof(int)*f_v.size(),0,D3DFMT_INDEX32,D3DPOOL_MANAGED,&pModel.IndexBuffer,NULL);
      if(HR) errMan->Error("Index buffer not created!");
      HR = pModel.IndexBuffer->Lock(0,sizeof(int)*f_v.size(),&pVertex,0);
      if(HR) errMan->Error("pModel.IndexBuffer->Lock(0,sizeof(int)*f_v.size(),&pVertex,0);");
      memcpy(pVertex,&f_v.at(0),sizeof(int)*f_v.size());
      HR = pModel.IndexBuffer->Unlock();
      pModel.nrIndices=f_v.size();

      //this->ComputeFaces();

   }
}
CObjMeshLoader::~CObjMeshLoader()
{
}

no a renderovanie
kód:
      { // OBJ mesh
         //hr = videoMan->vs->d3dDevice->SetStreamSource(0,modelMan->mesh.at(b).model.VertexPositionsBuffer,0,sizeof(D3DXVECTOR3));
         hr = videoMan->vs->d3dDevice->SetStreamSource(0,modelMan->mesh.at(b).model.testVertexBuffer,0,sizeof(FVF_CUSTOMVERTEX));
         hr = videoMan->vs->d3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX);
         hr = videoMan->vs->d3dDevice->SetIndices(modelMan->mesh.at(b).model.IndexBuffer);
         hr = videoMan->vs->d3dDevice->SetTexture(0, modelMan->mesh.at(b).pMeshTexturesA.at(0));
         //if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,modelMan->mesh.at(b).model.nrVertices,0,modelMan->mesh.at(b).model.nrIndices-2);
         if(!SHUTDOWN)hr = videoMan->vs->d3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,modelMan->mesh.at(b).model.testnrVertices-2);
      }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 19. říjen 2012, 18:02:24    Předmět: Odpovědět s citátem

Nemůžu si pomoct ale to přece nemůže fungovat Smile

Zkus se vrátit k index bufferu, ale udělej ho 16-bitový. Takhle ti to aspoň pojede všude.

Udělal bych to takhle:

přidej relační operátor < do FVF_CUSTOMVERTEX
udělej si mapu FVF_CUSTOMVERTEX na size_t
a vector FVF_CUSTOMVERTEX

při načítání faců se nejdřív podívej do mapy, a když tam bude, tak ulož second jako index
když ne, vlož to do mapy insert( FVF_CUSTOMVERTEX, verts.size() ) a tyhle indexy pro face si ulož někam lokálně, třeba do pole vi[4]

pak to rozhoď na trojůhelníky:

kód:

for (int i = 1; i<num_face_verts-1; i++)
{
     indices.push( vi[0] );
     indices.push( vi[i] );
     indices.push( vi[i+1] );
}


nebo tak něco.

No a na závěr to vyrenderuješ přes drawindexedprimitive.

Taky by bylo dobré si to rozhodit do skupin podle materiálu a ty budeš renderovat, skupina bude mít texturu, startovní pozici v index bufferu a počet vertexů (nebo primitiv? - nevím už přesně jak to je v d3d), pokud tedy budeš pracovat s meshi s víc materiály, ale to bych asi nechal až na závěr.
Snad to pomůže.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 20. říjen 2012, 15:25:30    Předmět: Odpovědět s citátem

Vdaka Mar.

Za pomoci tvojich rad som dnes vyrenderoval postavicku a uz ma aj na sebe texturu. Bohuzial zatial to robim bez index bufferu.

www.penzionorava.eu/predaj/guardok.png

No a teraz sa pustit a spojazdnit to cez index buffer.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 20. říjen 2012, 15:56:23    Předmět: Odpovědět s citátem

Zhuleny napsal:
Vdaka Mar.

Za pomoci tvojich rad som dnes vyrenderoval postavicku a uz ma aj na sebe texturu. Bohuzial zatial to robim bez index bufferu.

www.penzionorava.eu/predaj/guardok.png

No a teraz sa pustit a spojazdnit to cez index buffer.


Pěkné, gratuluji Smile Jestli to chceš optimalizovat, chtělo by to fps counter (nebo aspoň vykreslovat frame time v něčem rozumném - ms?)
A můžes zkusit i mipmapping, aspoň směrové světlo (vypadá to unlit - pletu se?).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna