2015-02-24 81 views
1

我使用這樣的紋理緩衝對象:如何寫入紋理緩衝區對象?

glGenBuffers(1, &tbo); 
glBindBuffer(GL_TEXTURE_BUFFER, tbo); 
glBufferData(GL_TEXTURE_BUFFER, maxSize*sizeof(float), faceNormals.data(), GL_STATIC_DRAW); 
glGenTextures(1, &tbo_tex); 
glBindBuffer(GL_TEXTURE_BUFFER, 0); 

,我可以閱讀使用texelFetch(u_tbo_tex,指數)我的計算着色器裏面,但我怎麼能更新該值?

謝謝! luiz

+0

爲什麼要這麼做首先呢?如果您使用計算着色器,請改用'imageLoad'和'imageStore'。這幾乎是您要從計算着色器寫入紋理的唯一方法。如果你這樣做的話,你將不得不考慮內存一致性,但是在計算着色器的某個時刻你必須處理這個問題。 – 2015-02-25 09:39:12

回答

4

將它綁定爲samplerBuffer,因爲我假設您正在爲texelFetch()做的事情會爲您提供只讀訪問權限。不知道這個緩存是否更好,但是imo可以比imageLoad()快一點點。

要從計算着色器寫入紋理緩衝區,請使用image_load_store

  • 聲明在着色器諸如圖像:

    layout(rgba32f) uniform imageBuffer mybuffer; 
    
  • 綁定您紋理對象(它封裝緩衝對象):

    void glBindImageTexture(GLuint unit, 
        GLuint texture, 
        GLint level, 
        GLboolean layered, 
        GLint layer, 
        GLenum access, 
        GLenum format); 
    

    unit可以是任何但當然必須是獨一無二的。統一的值必須設置爲該索引。即glUniform1i(mybufferlocation, unit)(或硬編碼layout(),但我從來沒有這樣做過)。

  • 然後你就可以...

    imageStore(mybuffer, atsomeindex, vec4(123.0)); 
    
  • 確保使用着色器之間傳遞glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT)是讀/寫。另外,如果着色器調用中存在潛在的競爭條件,請查看memoryBarrier/memoryBarrierImagecoherent限定符。

這也是值得一提的SSBOs(有什麼區別?here & here)。

Transform feedback也可直接寫爲緩衝從頂點着色器的輸出對象從幾何着色器進行流壓縮,但這並不適用於您的計算着色器。