Почему-то при создании поверхности больше 4х4 клетки приложение закрывается или вылетает с ошибкой. При дебаге с любым количеством клеток дебаггер ругается на ShowWindow(). Путем отключения разных частей кода поял, что ошибка в той части кода, что между двумя большими двойными полосками, но в чем именно ошибка до сих пор понять немогу((
//Global.h #pragma once #include <d3d9.h> #include <d3dx9.h> #include "Terrain.h" #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1) struct CUSTOMVERTEX { D3DXVECTOR3 position; // The position //D3DCOLOR color; // The color FLOAT tu, tv; // The texture coordinates };
//Terrain.h #pragma once #include <d3d9.h> #include <d3dx9.h> class Terrain{ private: LPDIRECT3DVERTEXBUFFER9 m_vb; LPDIRECT3DINDEXBUFFER9 m_ib; D3DMATERIAL9 m_material; D3DXVECTOR3 minBounds; D3DXVECTOR3 maxBounds; int numCellsWide; int numCellsHigh; int numVertsX; int numVertsZ; public: Terrain(int CellsWide, int CellsHigh, D3DXVECTOR3 minPos, D3DXVECTOR3 maxPos); void CreateTerrain( LPDIRECT3DDEVICE9 g_pd3dDevice); void DrawTerrain( LPDIRECT3DDEVICE9 g_pd3dDevice); };
//Terrain.cpp #include "Global.h" #include "Terrain.h" Terrain::Terrain(int CellsWide, int CellsHigh, D3DXVECTOR3 minPos, D3DXVECTOR3 maxPos){ numCellsHigh = CellsWide; numCellsWide = CellsWide; minBounds = minPos; maxBounds = maxPos; numVertsX = numCellsWide+1; numVertsZ = numCellsHigh+1; } void Terrain::CreateTerrain( LPDIRECT3DDEVICE9 g_pd3dDevice){ g_pd3dDevice->CreateVertexBuffer( numVertsX*numVertsZ*sizeof( CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &m_vb, NULL ); CUSTOMVERTEX* pVertices; m_vb->Lock( 0, 0, ( void**)&pVertices, 0 ); float stepX=( maxBounds.x-minBounds.x)/numCellsWide; float stepZ=( maxBounds.z-minBounds.z)/numCellsHigh; D3DXVECTOR3 pos( minBounds.x, minBounds.y, minBounds.z); int count=0; int uvcount=0; // Loop across and up for ( int z=0;z<numVertsZ;z++) { pos.x=minBounds.x; for ( int x=0;x<numVertsX;x++) { if ( uvcount=0){pVertices[count].tu=0; pVertices[count].tv=0;} if ( uvcount=1){pVertices[count].tu=0; pVertices[count].tv=1;} if ( uvcount=2){pVertices[count].tu=1; pVertices[count].tv=1;} if ( uvcount=3){pVertices[count].tu=0; pVertices[count].tv=1;} // Create the verts pVertices[count].position=pos; // Increment x across pos.x+=stepX; count++; } // Increment Z pos.z+=stepZ; } m_vb->Unlock( ); //------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------- g_pd3dDevice->CreateIndexBuffer( 2*numVertsX*numVertsZ,D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_ib, NULL); WORD *indices=NULL; m_ib->Lock( 0, 0, ( void**)&indices, 0 ); count=0; int vIndex=0; for ( int z=0;z<numCellsHigh;z++) { for ( int x=0;x<numCellsWide;x++) { // first triangle indices[count++]=vIndex; indices[count++]=vIndex+numVertsX; indices[count++]=vIndex+numVertsX+1; // second triangle indices[count++]=vIndex; indices[count++]=vIndex+numVertsX+1; indices[count++]=vIndex+1; vIndex++; } vIndex++; } m_ib->Unlock( ); //----------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------- // CREATING MATERIAL ZeroMemory( &m_material, sizeof( D3DMATERIAL9) ); m_material.Diffuse.r = m_material.Ambient.r = 0.5; m_material.Diffuse.g = m_material.Ambient.g = 0.5; m_material.Diffuse.b = m_material.Ambient.b = 0.5; m_material.Diffuse.a = m_material.Ambient.a = 1.0f; } void Terrain::DrawTerrain( LPDIRECT3DDEVICE9 g_pd3dDevice){ g_pd3dDevice->SetMaterial( &m_material ); //g_pd3dDevice->SetTexture(0,NULL); g_pd3dDevice->SetStreamSource( 0, m_vb,0, sizeof( CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice->SetIndices( m_ib); // draw a triangle list using vertices and triangles g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,numVertsX*numVertsZ,0,numCellsHigh*numCellsWide*2); }
Индексный буфер ты создал размером 2*numVertsX*numVertsZ,при 4*4 клетках это у тебя 2*5*5=50 байт, это 3 с хвостиком ворда :)
Далее ты в двух циклах проходишь numCellsHigh*numCellsWide*6 вордов, при 4*4 клетках это 4*4*6=96 вордов. Это определенно больше 3-х с хвостиком, вот за границу и вылазишь.
И еще не помешали бы хоть минимальные проверки на возвращаемые значения директа...
Спасибо, помогло.
Да, был тут один товарищ, который советовал всегда больше памяти выделять :)
Видимо KLkon не слушал его :)
Не совсем понятно почему, если поменять режим рисования на D3DPT_LINELIST, то отображается не квадрат, а прямоугольник с углами по сторонам, к тому же даже он не до конца.
KLkon
> Не совсем понятно почему, если поменять режим рисования на D3DPT_LINELIST, то
> отображается не квадрат, а прямоугольник с углами по сторонам, к тому же даже
> он не до конца.
Линия рисуется по 2м индексам, а треугольник(3 линии) по 3м индексам.
Тема в архиве.