2013-06-09 13 views
6

3Dテクスチャの初期化をCPUからGPUに移動します。テストとして、すべてのボクセルを一定の値に設定するシェーダーを書きましたが、テクスチャはまったく変更されません。私はそれをどのように機能させるのですか?3Dテクスチャを修正していない計算シェーダ

計算シェーダ:

#version 430 

layout(local_size_x=1, local_size_y=1, local_size_z=1) in; 
layout(r8, location = 0) uniform image3D volume; 

void main() 
{ 
    imageStore(volume, ivec3(gl_WorkGroupID), vec4(0)); 
} 

呼び出し:

glEnable(GL_TEXTURE_3D); 
glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &volume_tid); 
glBindTexture(GL_TEXTURE_3D, volume_tid); 
glTexImage3D(GL_TEXTURE_3D, 0, GL_R8, volume_dims[0], volume_dims[1], volume_dims[2], 0, GL_RED, GL_UNSIGNED_BYTE, voxels); 

ShaderProgram computeVolumeShader; 
computeVolumeShader.loadShader(GL_COMPUTE_SHADER, "compute_volume.glsl"); 
computeVolumeShader.link(); 
computeVolumeShader.use(); 
computeVolumeShader.uniform("volume", 0); 
glBindImageTexture(0, volume_tid, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8); 
glDispatchCompute(volume_dims[0], volume_dims[1], volume_dims[2]); 
glBindImageTexture(0, 0, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R8); 
computeVolumeShader.unUse(); 
glMemoryBarrier(GL_ALL_BARRIER_BITS); 

voxelsglTexImage3DにCPU初期化データを含む供給。

+0

'GL_RED'の代わりに実際のイメージフォーマットを使ってみましたか? –

+0

@Nicol 'GL_R8UI'を使うと、計算シェーダがなくても何も表示されません。私は 'sampler3D'をレンダリングに使用しますが、違いがありますか? 'GL_RED'は表1の[here](http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3D.xml)にリストされているので、使用することは大丈夫ですか?あなたは 'internalFormat'パラメータについて話しています。 –

+0

しかし、あなたは 'GL_RED'が実際に何を意味するのか分かりません。 'GL_R8'を与えるかもしれません。それは 'GL_R16'を与えるかもしれません。 *特定の*形式を選択しないと、形式を選択する権利を放棄します。 'GP_R8UI'を使用したとき、ピクセル転送を[正規化された浮動小数点数の代わりに積分データをアップロードする]に設定していなかった可能性が高いため、動作を停止しました(http://www.opengl.org/wiki/Pixel_Transfer#Integer_format)。 –

答えて

13

ええ。したがって、明らかに3Dテクスチャをレイヤーとしてバインドする必要があります。そうでなければ、シェーダはw> 0のuvw座標を変更できません。

glBindImageTexture(0, volume_tid, 0, /*layered=*/GL_TRUE, 0, GL_READ_WRITE, GL_R8); 

です。

+0

ダンケーショーン! :) –

+1

私はこれに半日失った。ありがとうございました!!!私はそれが分かったとは思わない。 –

+0

ちょうどこれを介してクレイジーな旅行を過ごした。これはNvidia GM107では動作しましたが、GK110bでは動作しませんでした(どちらも最新のドライバ)。 : - / – FHoenig

関連する問題