저는 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의 소스 코드를 살펴보십시오.
에
DepthStencilState
을 설정? 당신은 출력 창에서 잘못하고있는 것을 알려주는 많은 메시지를 얻어야합니다. – GozGoz : 무의미한 경고가 있습니다. – faulty