簡體   English   中英

GLSL:統一緩沖區對象中的浮點數組

[英]GLSL: Float array in uniform buffer object

我有一個這樣的統一緩沖區(GLSL / GPU):

layout(std140) uniform UConstantBufferPS1
{
    float m_LuminanceHistory[8];
};

我這樣上傳數據(C ++ / CPU):

SHistoryBuffer* pHistogramHistory = static_cast<SHistoryBuffer*>(Gfx::BufferManager::MapConstantBuffer(m_BufferSetPtr->GetBuffer(1)));

pHistogramHistory->m_LuminanceHistory[0] = 1.0f;
pHistogramHistory->m_LuminanceHistory[1] = 1.0f;
pHistogramHistory->m_LuminanceHistory[2] = 1.0f;
pHistogramHistory->m_LuminanceHistory[3] = 1.0f;
pHistogramHistory->m_LuminanceHistory[4] = 1.0f;
// ...

Gfx::BufferManager::UnmapConstantBuffer(m_BufferSetPtr->GetBuffer(1));

在GLSL端,除了第一個和第二個浮點值(m_LuminanceHistory [0])之外,其他所有內容均為0。 它似乎以某種方式包裝!

一個不好的解決方案是在CPU和GPU上定義一個浮點向量(vec4)數組。 然后,我可以在此數組內進行迭代並讀取數組的每個x值。 但是那時我的開銷很大。

有什么好的解決辦法嗎? THX 4我們的幫助!

編輯:

我使用以下解決方案:

layout(std140) uniform UConstantBufferPS1
{
    vec4 m_LuminanceHistory[2];  
};

float History[8];

History[0] = m_LuminanceHistory[0].x;
History[1] = m_LuminanceHistory[0].y;
History[2] = m_LuminanceHistory[0].z;
History[3] = m_LuminanceHistory[0].w;
History[4] = m_LuminanceHistory[1].x;
History[5] = m_LuminanceHistory[1].y;
History[6] = m_LuminanceHistory[1].z;
History[7] = m_LuminanceHistory[1].w;

該解決方案可以按預期工作,但我不知道為什么不能直接使用float [8]。

在您的Gtx :: BufferManager上沒有太多細節的情況下,我猜測以下可能有助於您進行調試的可能性。

  1. 嘗試注釋掉布局(std140)。
  2. 仔細檢查您是否已調用glBindBufferBase()將緩沖區對象的目標與正確的綁定點進行綁定(默認情況下,如果未在着色器中聲明UConstantBufferPS1時指定它,則應該以0開頭)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM