2016-11-27 178 views
1

我想渲染一組點到3D紋理中。但不知何故,我不寫它。使用glGetTexImage()我只能得到0的每個條目。我將3D紋理存儲在Framebuffer中,並且使用不同的渲染通道,我想從存儲在幀緩衝區中的3Dtexture中讀出信息。渲染成3D紋理

Initialization of the FrameBuffer. 
glGenFramebuffers(1, &_fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, _fbo); 


glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_3D, texture); 

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, GRID_SIZE, GRID_SIZE, GRID_SIZE, 0, GL_RGBA, GL_FLOAT, NULL); 

glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, texture, 0, 0); 

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { 
    std::cout << "FBO successfully loadet" << std::endl; 
}else{ 
    std::cout << "FBO had en ERROR" << std::endl; 
} 

頂點着色器:

#version 330 core 

layout (location = 0) in vec3 position; 

void main(){ 

    gl_PointSize = 1.0; 

    gl_Position = vec4(position,1.0); 

} 

片段着色器:

#version 330 core 

out vec4 fragColor; 

void main(){ 

    fragColor = vec4(1.0,1.0,1.0, 1.0); 

} 

我與正常的嘗試過渲染過程和在3D紋理單獨地存儲這些點之前。這似乎工作。但是現在使用幀緩衝區,它只寫入0。

+0

目前還不清楚你想要達到的目標。您只能渲染到一個3d紋理的圖層,而不是整個紋理。 – BDL

+0

那麼我必須分別渲染每個圖層嗎?這將是256次。我如何渲染到某個圖層? – Dominick

+2

你已經做了渲染到一個特定的層,那就是'glFrameBufferTexture3D'的'layer'參數是用於帽子的。您可能可以使用_layered_幀緩衝區獲得某些內容,但無法一次渲染到256個圖層。 – derhass

回答

1

你可以使用計算着色所有的點寫你的紋理3D與一個調用glDispatchCompute:

  • 寫下你想在一個SSBO或texture1D
  • 更新點的三維座標
  • 您SSBO/texture1D和你texture3D
  • 綁定您的計算着色器看起來應該像這樣綁定:

#version 430 
layout (binding=0, rgba16i) readonly uniform iimage1D points 
layout (binding=1, rgba16f) writeonly uniform image3D tex3D 

void main() 
{ 
    ivec3 point_coords = imageLoad(points, gl_GlobalInvocationID.x).xyz; 
    imageStore(tex3D, point_coords, vec4(1.0,1.0,1.0, 1.0)); 
} 
  • 呼叫glDispatchCompute(pointCount,0,0);
  • 調用glMemoryBarrier()與帕拉姆位域設置爲任何你想要做你的texture3D(當不確定GL_ALL_BARRIER_BITS是開始的好方法)