2017-11-10 14 views
0

の部分だけを読んで、シェーダを計算し、私は記述子セットに正確に1キロバイトバインドのサイズの均一なバッファを読み取り、 uint(の配列として、それを通過する非常に単純な計算シェーダを書きました)、次に各要素について、ダブルス値と記述子セット(およびもちろんのシェーダで定義された)に結合した別の記憶バッファに結果を書き込む:バルカンが均一バッファ

#version 450 core 

layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in; 

layout(set = 0, binding = 0) uniform InputBuffer 
{ 
    uint values[256]; 
} inputBuffer; 

layout(set = 0, binding = 1) buffer OutputBuffer 
{ 
    uint values[256]; 
} outputBuffer; 

void main(void) 
{ 
    for(int i = 0; i < 256; i++) { 
     outputBuffer.values[i] = inputBuffer.values[i] * 2; 
    } 

    return; 
} 

入力データは、均一介して提供されますrunniの前に、メモリが割り当てられ、書き込まれたバッファシェーダを使用します。

memset(*mappedMemory, 3, 1024); 

ストレージバッファにシェーダによって書き込まれた結果値は、データの四分の一が正しいと奇妙と思われる、その結果、を充填した:私は単にの値と各バイトを上書きします: enter image description here

Iサイズやオフセットがバルカン関数及びそれらの全てに設けられているコードにいくつかのポイントをチェックし、それぞれ、1024(1キロバイト)とあります。

これは、Vulkanがshaderで均一なバッファメモリからデータを読み取る方法と、std140のデータレイアウトがこの問題の原因になる可能性があるためです。私の知る限りチュートリアル/仕様には言及していませんオフセット要件の間の何か!

答えて

1

std140レイアウトの仕組みを忘れてしまった。基本型配列の要素は、、常に 16バイトです。したがって、uint values[256];、実際は、です。

outputBuffer.values[i] = inputBuffer.values[i/4][i % 4] * 2; 

は、次のようなuvec4 values[64];配列、およびインデックスを使用する必要があります

関連する問題