2013-06-09 20 views
6

3B dokusunun başlatılmasını CPU'dan GPU'ya taşımak istiyorum. Bir test olarak, tüm vokselleri sabit bir değere ayarlamak için bir gölgelendirici yazdım, ancak doku hiç değişmedi. Nasıl çalışırım?3d dokuyu değiştirmeyecek bilgi işlem gölgelendiricisi

hesaplayın Shader:

#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)); 
} 

Kullanılması:

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); 

Not: voxelsglTexImage3D içine işlemci başlatıldı verileri içeren beslenir.

+0

"GL_RED" yerine gerçek görüntü formatı kullanmayı denediniz mi? –

+0

@Nicol “GL_R8UI” kullandığımda, hesaplama gölgelendiricisi olmasa bile artık bir şey göremiyorum. Ben render için 'sampler3D' kullanıyorum, bu bir fark yaratıyor mu? GL_RED, tablo 1'de [burada] (http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3D.xml) listelendiğinden, kullanmanın uygun olmadığını düşündüm. 'InternalFormat' parametresi hakkında konuşuyorsunuz, değil mi? –

+0

Ama GL_RED'in aslında ne anlama geldiğini bilmiyorsunuz. Size GL_R8 verebilir. Size GL_R16 verebilir. * Belirli bir * biçimi seçmediğinizde, bir format seçme hakkından vazgeçersiniz. Ve 'GL_R8UI' kullandığınız zaman çalışmayı durdurdu çünkü muhtemelen piksel aktarımınızı [normalleştirilmiş şamandıralar yerine tümleşik verileri yükle] olarak ayarlamadınız (http://www.opengl.org/wiki/Pixel_Transfer#Integer_format). –

cevap

13

Ugh. Görünüşe göre bir 3B doku katman olarak ciltlenmelidir, aksi takdirde gölgelendirici herhangi bir uvw koordinatını w> 0 ile değiştiremez. İşleri hile yapar.

bu numarayı yapar.

+0

danke schön! :) –

+1

Buna yarım gün kaybettim. Teşekkür ederim!!! Sanırım asla anlayamazdım. –

+0

Sadece bunun üzerinden çılgın bir gezi geçirdim. Bu bir Nvidia GM107 üzerinde çalıştı, ancak GK110b (her ikisi de son sürücü) üzerinde yaptığı gibi kafa karıştırıcı oldu. : - / – FHoenig

İlgili konular