2014-01-06 6 views
1

학교용 최종 프로젝트에서 사용하기 위해 D3D11을 사용하여 매우 기본적인 메쉬 렌더러를 만들려고합니다. 내가 rastertek 사이트와 Frank De Luna의 책과 같은 기본적인 온라인 튜토리얼을 따라했지만, 가장 단순한 패스 쉐이더 쉐이더를 상상할 수있는 등, 삼각형을 화면에 표시 할 수 없었다. 마지막으로 VS 2013의 그래픽 디버깅 기능에 대해 알아 냈고 버텍스 및 인덱스 버퍼가 가비지 데이터로 가득 차 있음을 알 수있었습니다. 코드를 실행하려면 here 솔루션을 호스팅했지만 D3D 및 SharpDX C# 래퍼에 익숙한 사람이라면 다음 코드에서 내가 뭘 잘못하고 있는지 알 수 있습니까?SharpDX DataStream 기반 버퍼 초기화에 실패했습니다.

이것은 제 기하학 데이터입니다. Vertex 구조체에는 Vector4 위치 및 색상 필드가 있고 Index는 ushort의 별칭입니다.

var vertices = new[] 
{ 
    new Vertex(new Vector4(-1, 1, 0, 1), Color.Red), 
    new Vertex(new Vector4(1, 1, 0, 1), Color.Green), 
    new Vertex(new Vector4(1, -1, 0, 1), Color.Blue), 
    new Vertex(new Vector4(-1, -1, 0, 1), Color.White) 
}; 
var indices = new Index[] 
{ 
    0, 2, 1, 
    0, 3, 2 
}; 

그리고 위의 데이터로 내 버텍스 및 인덱스 버퍼를 초기화하지 못하는 코드는 다음과 같습니다.

var vStream = new DataStream(sizeInBytes: vertices.Length * sizeof(Vertex), canRead: false, canWrite: true); 
var iStream = new DataStream(sizeInBytes: indices.Length * sizeof(Index), canRead: false, canWrite: true); 
{ 
    vStream.WriteRange(vertices); 
    iStream.WriteRange(indices); 
    vBuffer = new Buffer(
     device, vStream, new BufferDescription(
      vertices.Length * sizeof(Vertex), 
      ResourceUsage.Immutable, 
      BindFlags.VertexBuffer, 
      CpuAccessFlags.None, 
      ResourceOptionFlags.None, 
      0)) { DebugName = "Vertex Buffer" }; 
    iBuffer = new Buffer(
     device, iStream, new BufferDescription(
      indices.Length * sizeof(Index), 
      ResourceUsage.Immutable, 
      BindFlags.IndexBuffer, 
      CpuAccessFlags.None, 
      ResourceOptionFlags.None, 
      0)) { DebugName = "Index Buffer" }; 
} 

위의 코드를 다음과 같이 바꾸면 작동합니다. 나는 내가 뭘 잘못하고 있는지 전혀 모른다.

vBuffer = Buffer.Create(
    device, vertices, new BufferDescription(
     vertices.Length * sizeof(Vertex), 
     ResourceUsage.Immutable, 
     BindFlags.VertexBuffer, 
     CpuAccessFlags.None, 
     ResourceOptionFlags.None, 
     0)); 
vBuffer.DebugName = "Vertex Buffer"; 
iBuffer = Buffer.Create(
    device, indices, new BufferDescription(
     indices.Length * sizeof(Index), 
     ResourceUsage.Immutable, 
     BindFlags.IndexBuffer, 
     CpuAccessFlags.None, 
     ResourceOptionFlags.None, 
     0)); 
iBuffer.DebugName = "Index Buffer"; 

답변

2

당신은 믿을 수 new Buffer(...)

+0

에 전달하기 전에 제로 (iStream.Position = 0를 같은)에 스트림 위치를 재설정해야, 그것을 작동합니다! 정말 고마워. – Drake

관련 문제