Я пытаюсь изучить концепции DirectX11 и программирование трехмерных игр в целом.Я читаю книгу https://www.amazon.com/Practical-Rendering-Computation-Direct3D-11/dp/1568817207
Я пытаюсь реализовать принцип рендеринга.Вот некоторые из классов, которые у меня есть:
class ShaderStage
{
public:
virtual ~ShaderStage() = default;
// all shader stages must implement these methods
virtual bool BindShader(Shader* shader) = 0;
virtual bool BindConstantBuffers(uint32_t start_slot, uint32_t count, ID3D11Buffer * const *buffers) = 0;
virtual bool BindSamplers(uint32_t start_slot, uint32_t count, ID3D11SamplerState *const *samplers) = 0;
virtual bool BindShaderResourceViews(uint32_t start_slot, uint32_t count, ID3D11ShaderResourceView * const *views) = 0;
// only computer shader stage supports Unordered Access View(UAV)
virtual bool BindUnorderedAccessViews(uint32_t start_slot, uint32_t count,
ID3D11UnorderedAccessView * const *views, const uint32_t* uav_counters)
{
return false;
}
protected:
ShaderStage(ID3D11DeviceContext* context)
: context_(context)
{
}
ID3D11DeviceContext* context_;
};
class VertexShaderStage : public ShaderStage
{
public:
VertexShaderStage(ID3D11DeviceContext* context): ShaderStage(context)
{
}
virtual ~VertexShaderStage() = default;
bool BindShader(Shader* shader) override
{
const auto vertex_shader = dynamic_cast<VertexShader*>(shader);
if (vertex_shader == nullptr)
return false;
context_->VSSetShader(vertex_shader->VertexShaderPtr(), nullptr, 0);
return true;
}
bool BindConstantBuffers(uint32_t start_slot, uint32_t count, ID3D11Buffer * const *buffers) override
{
if (buffers == nullptr || count==0)
return false;
context_->VSSetConstantBuffers(start_slot, count, buffers);
return true;
}
bool BindSamplers(uint32_t start_slot, uint32_t count, ID3D11SamplerState *const *samplers) override
{
if (samplers == nullptr)
return false;
context_->VSSetSamplers(start_slot, count, samplers);
return true;
}
bool BindShaderResourceViews(uint32_t start_slot, uint32_t count, ID3D11ShaderResourceView * const *views) override
{
if (views == nullptr)
return false;
context_->VSSetShaderResources(start_slot, count, views);
return true;
}
};
Я знаю, что каждая программируемая ступень шейдера может иметь Shader Program
, Contant Buffers
, Shader Resource Views
, Samplers
и Unordered Access Views
.Но так как я все еще нахожусь на ранних стадиях изучения конвейера рендеринга, мне было интересно, что может быть лучшим способом реализации класса Shader State, который может устанавливать / снимать constant buffer slots
, shader resource view slots
и т. Д.
Некоторые экспертные данныебудет принята с благодарностью.