2011-02-25 3 views
0

저는 Direct3D 10 앱에 SlimDX를 사용하고 있습니다. 응용 프로그램에서 텍스처를로드하고 쉐이더 용 fx 코드를 사용하여 이미지를 메쉬 2에로드했습니다. 코드는 SlimDX의 샘플 "SimpleModel10"에서 수정되었습니다.첫 번째 메쉬 이후에 누락 된 깊이 정보

그리기 호출, 셰이더 설정 코드를 1 메쉬, 셰이더 (효과) 및 그리기 호출을 관리하는 클래스로 이동합니다. 그런 다음이 클래스의 복사본을 두 개 초기화 한 다음 하나씩 그리기 함수를 호출합니다.

메쉬의 Z 위치를 변경하는 방법에 관계없이 출력 결과는 나중에 그려지는 메쉬가 항상 위에 있습니다. 나중에 PIX를 사용하여 드로 콜을 디버깅 할 때, 첫 번째 메쉬가있는 동안 두 번째 메쉬에 깊이가 없다는 것을 알았습니다. 나는 3 메쉬로 시험해 보았습니다. 둘째와 셋째는 깊이가 없습니다. 재미있는 일은 모두 동일한 클래스에서 인스턴스화되며 동일한 그리기 호출을 사용합니다.

이러한 문제의 원인은 무엇입니까?

다음은 클래스의 그리기 기능에있는 코드의 일부입니다. 몇 가지 클래스가 복잡하기 때문에 나머지는 생략했습니다.

 PanelEffect.GetVariableByName("world").AsMatrix().SetMatrix(world); 

     lock (this) 
     { 
      device.InputAssembler.SetInputLayout(layout); 
      device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList); 
      device.InputAssembler.SetIndexBuffer(indices, Format.R32_UInt, 0); 
      device.InputAssembler.SetVertexBuffers(0, binding); 

      PanelEffect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(); 
      device.DrawIndexed(indexCount, 0, 0); 

      device.InputAssembler.SetIndexBuffer(null, Format.Unknown, 0); 
      device.InputAssembler.SetVertexBuffers(0, nullBinding); 
     } 

편집 : 나는 샘플의 기존 OnRenderBegin()와 OnRenderEnd()를 유지 많은 디버깅과 코드를 분리 한 후, 내가 발견 범인은 내 DrawString() 기능

internal void DrawString(string text) 
    { 
     sprite.Begin(SpriteFlags.None); 
     string[] texts = text.Split(new string[] {"\r\n"}, StringSplitOptions.None); 
     int y = PanelY; 
     foreach (string t in texts) 
     { 
      font.Draw(sprite, t, new System.Drawing.Rectangle(PanelX, y, PanelSize.Width, PanelSize.Height), FontDrawFlags.SingleLine, new Color4(Color.Red)); 
      y += font.Description.Height; 
     } 
     sprite.End(); 
    } 

코멘트에 Font.Draw()입니다 Font.Draw를 사용하여 문제를 해결하십시오. 어쩌면 다음 메쉬 드로우가 깊이를 버리게하는 몇몇 상태를 자동으로 설정합니다. SlimDX의 소스 코드를 살펴보십시오.

+0

DepthStencilState을 설정? 당신은 출력 창에서 잘못하고있는 것을 알려주는 많은 메시지를 얻어야합니다. – Goz

+0

Goz : 무의미한 경고가 있습니다. – faulty

답변

1

PIX에서 많은 디버깅을 한 결과입니다. Font.Draw()를 호출

는 자동으로 이전의 OutputMerger에 PIX의 세부 사항을 비교 후 넣어

  Context10_1.Device.OutputMerger.DepthStencilState = depthStencilState; 

Font.Draw

솔루션 호출 한 후입니다, D3D10_COMPARISON_NEVER에 DepthFunction false과 DepthEnable을 설정합니다 그 다음 메쉬 그리기 전에 전화가 문제를 해결했습니다. 당신은 다이렉트 컨트롤 패널에서 디버그를 돌려 봤어

는 이전에 난 단지 OnRenderBegin()

관련 문제