Войти
ПрограммированиеФорумГрафика

Проблема с константным буфером D3D11

#0
1:37, 2 дек. 2013

Создаю константный буффер

bool ND3D11ConstantBuffer::Create(unsigned int size_buffer)
  {
    
    mDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    mDesc.ByteWidth = size_buffer;
    mDesc.CPUAccessFlags = 0;  
      
    HRESULT res = ND3D11Device::GetDevice()->CreateBuffer(&mDesc, NULL, &buffer);
    if (res != S_OK)
    {
      NLog::Get()->Error("ERROR: Create ConstantBuffer");
        return false;
    }
    return true;
  }

при отрисовке:

void ND3D11ConstantBuffer::Draw(CBPointLight cb)
  {
    ND3D11Device::GetContextDevice()->UpdateSubresource(buffer, 0, NULL, &cb, 0, 0);
    ND3D11Device::GetContextDevice()->VSSetConstantBuffers(0, 1, &buffer);
  }

в шейдере:

 cbuffer PointLight  : register(b0)
 {
  float3 lcolor;
  float3 lposition;
  float lrange;
  float lintesity;
};

Но все значения в шейдере у него 0, при рендере мешей в gbuffer все работало нормально, а тут не работает. В чем может быть проблема?


#1
4:55, 2 дек. 2013

Я не уверен.. но я не вижу копирования данных в буфер..

UpdateSubresource(buffer, 0, NULL, &cb, sizeof(cb), 0);
http://msdn.microsoft.com/en-us/library/windows/desktop/ff476486

#2
12:22, 2 дек. 2013

И ещё
Desc.ByteWidth = SizeBytes;
Desc.Usage = D3D11_USAGE_DYNAMIC;
Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
Desc.MiscFlags = 0;
Desc.StructureByteStride = 0;

#3
12:50, 2 дек. 2013

не помогает, хотя с структурой матриц работает

#4
12:53, 2 дек. 2013

rewad
Значит нужно получить расположение конст. регистров.
Или задать самому:
float3 lcolor : register(c0);
float3 lposition: register(c1);
...

#5
12:54, 2 дек. 2013

Ну и PIX глянуть

#6
13:28, 2 дек. 2013

rewad
> size_buffer
должен быть кратным 16(если вдруг проблема в этом)  :)

#7
14:11, 2 дек. 2013

k119_55524
я ему уже по float4 каждому давал, ни в какую( хотя дебагер из студии говорит что :
37:(obj:2) ID3D11DeviceContext::UpdateSubresource(obj:31,0,nullptr,addr:3,32,32)*
вроде все нормально

#8
15:21, 2 дек. 2013

Вот еще лишним не будет...
http://msdn.microsoft.com/en-us/library/windows/desktop/bb509632

      Lola::BufferData cb_data;
      cb_data.bufferBind = Lola::BB_ConstantBuffer;
      cb_data.bufferCPUAccess = Lola::BCA_Null;
      cb_data.bufferMisc = Lola::BM_Null;
      cb_data.bufferUsage = Lola::BU_Default;
      cb_data.data = 0;
      cb_data.stride = 0;
      cb_data.size = sizeof(VSShaderConstantBuffer0);
      Lola::BufferResource* cb_buffer = rcontroller->GetResourceLoader()->CreateBuffer(&cb_data);
      context->UpdateSubresource(constant_buffer0,0,0,&vs_cs0,sizeof(vs_cs0),0);    
      context->VSSetConstantBuffers(0,1,&constant_buffer0);
И помимо этого не видно в какой шейдер вы хотите передать константу... по вашему коду она уходит только в вершинный шейдер.
#9
19:34, 2 дек. 2013

RockFate
спасибо, проблема именно в этом была

ПрограммированиеФорумГрафика

Тема в архиве.