2016-11-27 19 views
1

ポイントのセットを3Dテクスチャにレンダリングしたい。しかし、どういうわけか私はそれに書きません。 glGetTexImage()を使うと、すべてのエントリに対して0しか得られません。フレームバッファに3Dテクスチャを格納していますが、フレームバッファに格納されている3Dテクスチャから情報を読み出すために別のレンダーパスを使用しています。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

それはあなたが達成したいかは不明です(わからないGL_ALL_BARRIER_BITSを開始するには良い方法であるとき)あなたが意図するものにセットのparamビットフィールドと

  • コールglMemoryBarrierは()あなたのtexture3Dで行います。テクスチャ全体ではなく、3Dテクスチャの1つのレイヤにのみレンダリングできます。 – BDL

  • +0

    だから、各レイヤーごとに別々にレンダリングする必要がありますか?それは256時間になります。そして、どのようにして特定のレイヤーにレンダリングするのですか? – Dominick

    +2

    あなたはすでに特定のレイヤーにレンダリングしています。つまり、 'glFrameBufferTexture3D'の' layer'パラメータは、です。 _layered_フレームバッファを使用して何かを得ることができるかもしれませんが、1回のパスで256レイヤにレンダリングすることはできません。 – derhass

    答えて

    1

    あなたはglDispatchComputeに1回の呼び出しであなたのテクスチャ3Dにすべてのあなたのポイントを書くことコンピュートシェーダを使用することができます。

    • あなたはSSBOで更新したいポイントまたはtexture1D
    • の3D座標を書きます

    :あなたの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);
  • 関連する問題