2012-09-14 3 views
2

Big 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 ... Никто не работает, как я хочу.

Что касается матрицы проекции, я пробовал также много близкого и дальнего расстояния. (ширина куба: 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; 
}; 
[...] 

Edit: Я попытался с BasicEffect и проблема та же ...

Так что ... Спасибо за любую помощь;)

ответ

2

Ok это оно.

pp.DepthStencilFormat = DepthFormat.Depth24Stencil8; 

должны быть перед созданием устройства вызова.

Так что я не знаю, в это время, почему:

Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8; 

ранее называлась в моей главной функции Draw, не работает ...

Выводы?

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 является результатом - запись на него фактически не изменяет состояние устройства. Он обновляется всякий раз, когда устройство настроено или перезагружено.

Как правило, вы настраиваете GraphicsDevice с помощью GraphicsDeviceManager - он обрабатывает настройку, сброс и отключение устройства для вас. Он является частью стандартного проекта шаблона XNA Game.

Правильный способ изменения состояний - установить требуемые значения на GraphicsDeviceManager. В вашем случае вы можете просто установить PreferredDepthStencilFormat.

После того, как вы сделаете это, вы должны либо настройки устройства (например: задать параметры в игровом конструкторе и XNA сделает все остальное), или сбросом устройства по телефону GraphicsDeviceManager.ApplyChanges - что вы должны, как правило, только в ответ на ввод пользователя (и, очевидно, не каждый кадр). См. this answer.


Вы заметите, что есть некоторые параметры представления, которые не являются непосредственно устанавливаемыми на GraphicsDeviceManager. Чтобы изменить их, вам нужно будет привязать обработчик событий к GraphicsDeviceManager.PreparingDeviceSettings. Аргумент события предоставит вам доступ к версии параметров презентации, которую вы можете использовать . полезно изменить (e.GraphicsDeviceInformation.PresentationParameters) - в настройках есть то, что используется при создании графического устройства.