Как реализовать программируемое состояние шейдера? - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь изучить концепции 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 и т. Д.

Некоторые экспертные данныебудет принята с благодарностью.

...