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: voxels
glTexImage3D
içine işlemci başlatıldı verileri içeren beslenir.
"GL_RED" yerine gerçek görüntü formatı kullanmayı denediniz mi? –
@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? –
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). –