2011-01-13 4 views
1

У меня есть код, который генерирует пейзаж, превращает его в сетку, а затем отображает его.Управляемый Direct3DX Mesh Vertex/Index limit?

Ландшафт основан на трехмерной таблице и генерирует 4 вершины на положительную запись в таблице. Я определяю размер таблицы в начале.

Проблемы есть

Mesh mesh = new Mesh(indexes.Count/3,vertexes.Count, MeshFlags.Managed, CustomVertex.PositionNormalTextured.Format, device); 

где индексы является массивом шорт для индексов и вершин представляет собой массив CustomVertex.PositionNormalTextured держит свои вершины.

Мой код работает отлично подходит для небольших размеров (например, 32x32x32), но что-то вроде 64x64x64 он падает на строку выше со следующей ошибкой

Microsoft.DirectX.Direct3D.Direct3DXException was unhandled 
Message=Error in the application. 
Source=Microsoft.DirectX.Direct3DX 
ErrorCode=-2005530516 
ErrorString=D3DERR_INVALIDCALL 
StackTrace: 
    at Microsoft.DirectX.Direct3D.Mesh..ctor(Int32 numFaces, Int32 numVertices, MeshFlags options, VertexFormats vertexFormat, Device device) 
    at mycode.Form1.Landscape() in d:\Files\My Documents\Visual Studio 2010\Projects\mycode\mycode\Form1.cs:line 488 
    at mycode.Form1.GenerateGeometry() in d:\Files\My Documents\Visual Studio 2010\Projects\mycode\mycode\Form1.cs:line 223 
    at mycode.Form1..ctor() in d:\Files\My Documents\Visual Studio 2010\Projects\mycode\mycode\Form1.cs:line 40 
    at mycode.Program.Main() in d:\Files\My Documents\Visual Studio 2010\Projects\mycode\mycode\Program.cs:line 20 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

В точке, в которой он выходит из строя индексов имеет счетчик 231,480 и вершины имеют значение 154,320

было бы лучше разделить его на 64 ячейки, по одному для каждого уровня Z?

+0

Ну, похоже, что разбиение ландшафта на блоки 32x32x32 сработало, странно, что ошибка возникает вообще. –

+0

Как сообщить DirectX9 включить 32-битный индексный буфер? – zionpi

ответ

0

Похоже, ваш меш по умолчанию использует 16-разрядный буфер индекса. Я больше не могу найти документацию для Managed DirectX (MS удалил ее повсюду), но посмотрите, можете ли вы явно указать ей на использование 32-разрядного индексного буфера.