2012-09-14 2 views
2

큰 headhache 렌더링 호기심 깊이 (내게로) : 이미 유사한 문제에 대한 많은 답을 발견했습니다
XNA 4.0 풀리지 깊이 문제와 관련된 XNA 4.0

enter image description here


,하지만 하나의 작업 나를 위해 ...

장치는 다음과 같이 설정됩니다

잔인한 문제 해결로
xnaPanel1.Device.BlendState = BlendState.Opaque;     
xnaPanel1.Device.DepthStencilState = DepthStencilState.Default; 
xnaPanel1.Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8; 
[...] 
Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 4.0f/3.0f, 0.1f, 1000f); 

, 내가 시도 대부분의 DepthStencilFormat 및 DepthStencilState 가능성 ... 아무도 내가 원하는 것처럼 작동하지 않습니다.

투영 매트릭스에 대해서는 많은 nearclip 및 farclip 값도 시도했습니다. (큐브 너비 : 10f) 올바른 결과를 얻을 수 없습니다.

나는 많은 불투명 한 텍스처로 이것을 테스트 해 보았습니다.

BasicEffect는 사용하지 않지만 텍스처 + 노멀 맵을 사용하는 효과는 문제의 원인이 될 수 있습니까?

CubeEffect.fx

[...] 
sampler2D colorMap = sampler_state 
{ 
Texture = <colorMapTexture>; 
    MagFilter = Linear; 
    MinFilter = Anisotropic; 
    MipFilter = Linear; 
    MaxAnisotropy = 16; 
}; 
sampler2D normalMap = sampler_state 
{ 
    Texture = <normalMapTexture>; 
    MagFilter = Linear; 
    MinFilter = Anisotropic; 
    MipFilter = Linear; 
    MaxAnisotropy = 16; 
}; 
[...] 

편집 : 나는 BasicEffect로 시도하고 문제는 ... 어떤 도움을 주셔서 감사합니다

그래서 동일)

답변

2

확인 그게 다야.

pp.DepthStencilFormat = DepthFormat.Depth24Stencil8; 

장치 제작 전에 통화 해야한다. 이전에 내 주요 그리기 기능에

Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8; 

라고 ... 작동하지 않습니다

결론이 왜

그래서 나는이 시간에 몰라?

PresentationParameters pp = new PresentationParameters(); 
pp.IsFullScreen = false; 
pp.BackBufferHeight = this.renderControl.Height; 
pp.BackBufferWidth = this.renderControl.Width; 
pp.DeviceWindowHandle = renderControl.Handle; 
pp.DepthStencilFormat = DepthFormat.Depth24Stencil8; 
this.graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, pp); 

이제 제대로 작동합니다.

+0

Btw, 자신의 질문에 대답 해 주시면 정답으로 표시하셔야합니다. – dowhilefor

+0

필자는 모든 PresentationParameters 항목이 제 대답에서 어떻게 작동하는지에 대한 설명을했습니다. –

1

PresentationParameters는 장치 생성 방법을 정의하는 구조입니다. 그래픽 장치를 만들 때 초기 구성에만 사용되는 구조체를 전달해야한다는 것을 이미 보았습니다.

장치는 프레젠테이션 매개 변수를 저장하지만 장치에서 재설정을 호출하지 않으면 아무 것도 변경하지 않고 장치를 다시 초기화하여 변경 한 매개 변수를 사용합니다. 이는 값 비싼 작업이므로 매우 자주 수행하고 싶지는 않습니다.

0

기본적으로 GraphicsDevice.PresentationParameters출력입니다.이 문자를 쓰는 것은 실제로 장치 상태를 변경하지 않습니다. 장치가 설정 또는 재설정 될 때마다 업데이트됩니다.

일반적으로 은 GraphicsDeviceManager을 사용하여 설정합니다. 기기 설정, 재설정 및 분쇄를 처리합니다. 이는 기본 XNA Game 템플릿 프로젝트의 일부입니다.

상태를 수정하는 올바른 방법은 원하는 값을 GraphicsDeviceManager에 설정하는 것입니다. 귀하의 경우에는 PreferredDepthStencilFormat을 간단하게 설정할 수 있습니다. (: 게임 생성자에서 설정을 지정하고 XNA는 나머지를 할 것입니다 예) 또는 GraphicsDeviceManager.ApplyChanges를 호출하여 장치 재설정 - 어떤 당신이 일반적으로해야 이렇게되면

, 당신이 중 하나를 설정 장치가 필요 사용자 입력 (물론 모든 프레임이 아님)에 대한 응답으로 만 수행됩니다. 자세한 내용은 this answer을 참조하십시오.


당신은 GraphicsDeviceManager에 직접 설정할 수없는 일부 프리젠 테이션 매개 변수가 있다는 것을 알게 될 것이다. 이를 변경하려면 GraphicsDeviceManager.PreparingDeviceSettings에 이벤트 처리기를 연결해야합니다. 이벤트 인수는 프리젠 테이션 매개 변수 버전에 대한 액세스를 제공합니다. (e.GraphicsDeviceInformation.PresentationParameters) - 그래픽 장치가 생성 될 때 사용되는 설정이 유용합니다.