2015-02-24 3 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'. Это в значительной степени единственный способ, которым вы собираетесь писать текстуру из вычислительного шейдера. Вы должны будете учитывать согласованность памяти, если вы это сделаете, но в любом случае вы должны иметь дело с какой-то точкой в ​​вычислительных шейдерах. –

ответ

4

Связывание его как samplerBuffer, так как я предполагаю, что вы делаете для texelFetch(), вы получите доступ только для чтения. Не уверен, что этот кеш лучше, но imo может быть немного быстрее, чем imageLoad().

Чтобы написать текстурные буферы из вычислительного шейдера, используйте image_load_store.

  • Объявите изображение в затенении, таких как:

    layout(rgba32f) uniform imageBuffer mybuffer; 
    
  • Bind вашего текстуры объекта (который оборачивает объект буфера):

    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/memoryBarrierImage и квалификатор coherent.

Стоит также отметить SSBOs (в чем разница? here & here).

Transform feedback также может написать непосредственно в буфере объектов из выхода вершинных шейдеров и выполнения потока уплотнения из геометрических шейдеров, но это не относится к вашим вычислительным шейдерам.