2017-02-19 23 views
1

В OpenGL Я пытаюсь вывести немасштабированный поплавок из моего шейдера фрагмента в привязку цвета FBO для мыши по набору значений. Однако я не могу заставить свой код шейдера фрагмента правильно записать значение.GL_32F и glReadPixels

добавить вложение цвета для хранения значений выбора в фреймбуфером рисую к следующим:

// ... Bind FBO .etc. 
glTexImage2D(
    GL_TEXTURE_2D, 
    0, 
    GL_R32F, 
    DrawTextureDims.width(), 
    DrawTextureDims.height(), 
    0, 
    GL_RED, 
    GL_FLOAT, 
    0); 
glFramebufferTexture2D(
    GL_FRAMEBUFFER, 
    GL_COLOR_ATTACHMENT2, 
    GL_TEXTURE_2D, 
    pointsMeshData->magnitudeTexture, 
    0); 

и настройка Жеребьевка буферов до рисования следующим образом:

// ... 
    GLenum drawBufs[2] { 
     GL_COLOR_ATTACHMENT0, 
     GL_COLOR_ATTACHMENT2 
    }; 
    glDrawBuffers(2,drawBufs); 

    GLfloat clearMagnitude[4] { 0,0,0,0 }; 
    glClearBufferfv(GL_COLOR,1,clearMagnitude); 

    // Bind VAO and shader. Setup uniforms and call glDrawElements() 

И, наконец, считывается следующим образом:

... 
glBindFramebuffer(GL_READ_FRAMEBUFFER,drawData->renderFBO.handle()); 
glReadBuffer(GL_COLOR_ATTACHMENT2); 
glBindBuffer(GL_PIXEL_PACK_BUFFER,0); 

*magnitude = 0.f; 
glReadPixels(x,y,1,1,GL_RED,GL_FLOAT,magnitude); 
... 

Однако, когда я выводю на второй цветной прижим nt, используя следующий шейдер фрагмента, ничего не нарисовано. Я вернусь цветом я очищенный с (clearMagnitude) от glReadPixels()

#version 330 

in float scale; 
uniform sampler1D uPalette; 
layout(location=0) out vec4 color; 
layout(location=1) out float oScale; 

void main(void) 
{ 
    color = texture(uPalette,scale); 
    oScale = scale; 
} 

С другой стороны, когда я вывожу, используя следующий (явно неправильно) фрагмент шейдера я получаю значение масштабируется (0-1) назад в glReadPixels():

#version 330 

in float scale; 
uniform sampler1D uPalette; 
layout(location=0) out vec4 color; 
layout(location=1) out vec4 oScale; 

void main(void) 
{ 
    color = texture(uPalette,scale); 
    oScale = vec4(scale,scale,scale,1); 
} 

Что я делаю неправильно? Как я могу выводить и читать один немасштабированный поплавок в GLSL?

+0

oScale = vec4 (шкала, масштаб, масштаб,/1 /); В самом деле? –

ответ

2

выход I, используя следующий (явно неправильно) фрагмент шейдера

Там нет ничего плохого в том, что пиксельный шейдер. Точно так же, как атрибуты вершин, подсчеты выходных компонентов фрагмента шейдера не должны совпадать с количеством компонентов целевого изображения. Если на вашем выходном изображении меньше компонентов, чем соответствующая переменная шейдера фрагмента, тогда она просто примет компоненты, соответствующие изображению, и проигнорирует остальные.

Однако у вас нет , чтобы вывести vec4 только для записи на одноканальное изображение. Ваш пример float должен работать нормально, поэтому в игре может появиться ошибка драйвера.

Что касается проблемы масштабирования, это вина другой вещи: read color clamping. Вы должны использовать glClampColor, чтобы сообщить OpenGL не зажимать чтения с плавающей запятой. Например:

glClampColor(GL_CLAMP_READ_COLOR, GL_FIXED_ONLY); 

Это предотвращает защемление при чтении прикрепленных изображений FBO с фиксированными форматами.

Это не часть состояния FBO; это просто значение контекста. Поэтому вы можете просто установить его один раз и забыть об этом.