SharpDX: включение BlendState

Я пытаюсь заставить "SharpDX.Direct3D11.DeviceContext.OutputMerger.Blendstate" работать. Без этого у меня есть хорошая сцена (полигоны с текстурами на ней, для космического шутера). Я занимался графикой OpenGL в течение последних трех лет, поэтому я подумал, что это может быть так же просто, как и в OpenGL — просто включите смешивание и установите правильные режимы Dst/Src. Но если я установлю новое описание BlendStateDescription, весь вывод будет черным, даже если для «RenderTarget[x].IsBlendEnabled» установлено значение «false». Я искал учебник или что-то в этом роде и нашел его, но он использует эффекты. Итак, мой вопрос прост: нужно ли использовать технику и эффекты в SharpDX? Другого пути для простого смешивания не осталось?

Вот что я сделал:

mBackBuffer = Texture2D.FromSwapChain<Texture2D>(mSwapChain, 0);
mRenderView = new RenderTargetView(mDevice, mBackBuffer);
mContext.OutputMerger.SetTargets(mDepthStencilView, mRenderView);
mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);

mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = true;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceBlend = BlendOption.SourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha;
mContext.OutputMerger.BlendState.Description.RenderTarget[0].BlendOperation = BlendOperation.Add;           
mContext.OutputMerger.BlendState.Description.RenderTarget[0].SourceAlphaBlend = BlendOption.One;            
mContext.OutputMerger.BlendState.Description.RenderTarget[0].DestinationAlphaBlend = BlendOption.Zero;          
mContext.OutputMerger.BlendState.Description.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add;          
mContext.OutputMerger.BlendState.Description.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;           

И, даже если просто сделать:

mContext.OutputMerger.SetBlendState(new BlendState(mDevice, new BlendStateDescription()), new SharpDX.Color4(1.0f), -1);
mContext.OutputMerger.BlendState.Description.RenderTarget[0].IsBlendEnabled = false;

вывод весь черный.. может быть, мне просто нужно что-то изменить в пиксельных шейдерах?


person lunatix    schedule 12.10.2012    source источник


Ответы (1)


Все ресурсы в Direct3D11 являются неизменяемыми, поэтому при создании нового Blendstate(mDevice, new BlendStateDescription()) вы не сможете позже изменить описание. Обычный рабочий процесс:

var blendDescription = new BlendDescription();
blendDescription.RenderTarget[0].IsBlendEnabled = .. // set all values 
[...]
var blendState = new BlendState(device, blendDescription);
context.OutputMerger.SetBlendState(blendState, ...);

Кроме того, объекты ресурсов должны быть где-то сохранены и удалены, когда вы полностью закончите с ними (большую часть времени для состояний смешивания, в конце вашего приложения), иначе вы получите утечки памяти.

Я советую вам более внимательно изучить некоторые образцы Direct3D11 C++, если вы не уверены в использовании API. Кроме того, я рекомендую вам прочитать книгу Франка Д.Луна «Введение в программирование 3D-игр с помощью DirectX 11», которая идеально подходит для начала и изучения API Direct3D11.

person xoofx    schedule 12.10.2012
comment
Хорошо, спасибо, это приятно знать. Поэтому мне нужно создать несколько режимов наложения для своих нужд... и, да, я сохраняю их, чтобы в конце избавиться от ресурсов :) - person lunatix; 12.10.2012
comment
Наконец-то мне удалось заставить его работать с файлами эффектов! Спасибо за Ваш ответ :) - person lunatix; 12.10.2012