2016-05-31 18 views
4

ボクセル化されたシーンの色、法線などの3Dテクスチャがあります。このデータの一部は平均化できないため、自分でミップレベルを計算する必要があります。 3Dテクスチャサイズは(128 + 64)×128×128、追加の64×128×128はミップレベル用です。計算シェーダを使用したミップマッピング

したがって、128 x 128 x 128のサイズで(0、0、0)にある最初のミップレベルを取得し、ボクセルを2番目のレベルにコピーすると、(128,0,0 )データがそこに表示されますが、(128,0,0)の2番目のレベルを(128,0,64)の3番目のレベルにコピーすると、データは3番目のレベルに表示されません。

シェーダコード:

#version 450 core 

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

layout (location = 0) uniform unsigned int resolution; 
layout (binding = 0, rgba32f) uniform image3D voxel_texture; 

void main() 
{ 
    ivec3 index = ivec3(gl_WorkGroupID); 
    ivec3 spread_index = index * 2; 

    vec4 voxel = imageLoad(voxel_texture, spread_index); 
    imageStore(voxel_texture, index + ivec3(resolution, 0, 0), voxel); 

    // This isn't working 
    voxel = imageLoad(voxel_texture, spread_index + 
         ivec3(resolution, 0, 0)); 
    imageStore(voxel_texture, index + ivec3(resolution, 0, 64), voxel); 
} 

シェーダプログラムは、私はいくつかの基本的なことを逃した場合、私は知らない

glUniform1ui(0, OCTREE_RES); 

glBindImageTexture(0, voxel_textures[0], 0, GL_TRUE, 0, GL_READ_WRITE, 
        GL_RGBA32F); 

glDispatchCompute(64, 64, 64); 

に派遣され、これが私の最初のコンピュートシェーダです。私はまた、記憶の障壁を使用しようとしましたが、それは事を変更しませんでした。

答えて

2

あなたの2番目のimageLoadが、そのような最初の店で書いたテクセルを読むことは期待できません。

「ローカル」ワークグループの外部でアクセスを同期する方法はありません。

次のいずれかが必要です:

  • あなたは常に「オリジナル」ゾーンからフェッチするように、あなたのシェーダーロジックを書き換えるために、各レイヤ
  • を行うには、カーネルの複数の呼び出しを使用するには。
+0

私は障壁がグローバルに働いていると思っています... 128x128x128のローカルワークグループと2つのオプションを持つ1つの「グローバル」ワークグループを使用することが効率的でないかどうか知っていますか? – FamZ

+0

128x128x128のサイズを持つ1つのローカルワークグループを意味します。 – FamZ

+2

@FamZ:128x128x128のワークグループサイズが可能であると想定しています。 [どのハードウェアでもサポートされているグループ内の作業項目の最大数は1536です(http://opengl.gpuinfo.org/gl_stats_caps_single.php?listreportsbycap=GL_MAX_COMPUTE_WORK_GROUP_SIZE)。それは128^3よりもはるかに似ています。単にあなたが望むものは不可能です。妥当なワークグループサイズに収まるように、アルゴリズムやデータを再構成する方がよいでしょう。 –

関連する問題