Низкая точность и зажим при записи в FBO с плавающей точкой

У меня есть FBO, который был создан следующим образом:

glGenRenderbuffers(1, &m_depthStencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, m_width, m_height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_texture);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, m_width, m_height, 0, GL_RGBA, GL_FLOAT, 0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);

glGenFramebuffers(1, &m_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE_ARB, m_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuffer);
assert(GL_FRAMEBUFFER_COMPLETE == glCheckFramebufferStatus(GL_FRAMEBUFFER));
glBindFramebuffer(GL_FRAMEBUFFER, 0);
assert(GL_NO_ERROR == glGetError());

Затем я отрисовываю это с помощью этой программы с минимальным фрагментом:

void main() {
    gl_FragColor = float4(3.001001f, 2.00002f, 7.00003f, 4.00004f);
}

Если я прочитал пиксели, как это:

glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &pixels[0]);

и проверьте пиксели, записанные вышеприведенной фрагментной программой (1, 1, 1, 1). Я только добавилglReadPixels в целях тестирования у меня возникает та же проблема, если я пытаюсь сэмплировать FBO в другой фрагментной программе сtextureRect.

Ответы на вопрос(2)

Решение Вопроса

С моей стороны проблема заключалась в глупой ошибке в коде изменения размера FBO, который я назвал:

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, ...);

вместо

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, ...);

Да, он будет зафиксирован в диапазоне (0, 1) - проверитьglClampColor и отключить цветную фиксацию.

Надеюсь это поможет!

 Andreas Brinck08 июн. 2012 г., 19:08
Спасибо, проверим это, когда вернусь на работу в понедельник.
 08 июн. 2012 г., 21:11
@AndreasBrinck Для цвета фрагмента значение по умолчанию должно бытьGL_FIXED_ONLY, но это попытка.
 08 июн. 2012 г., 17:20
Однако он не должен применяться для выборки текстуры с плавающей запятой (как указано в OP).
 Andreas Brinck08 июн. 2012 г., 19:11
Похоже, мне может понадобиться glClampColor (GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); чтобы шейдер работал.
 08 июн. 2012 г., 17:53
Это относится к glReadPixels AFAIK. Таким образом, хотя результаты не могут быть зафиксированы на GPU, они могут быть зафиксированы при чтении. Из документации "glClampColor контролирует цветное ограничение, которое выполняется во время glReadPixels.target должно быть GL_CLAMP_READ_COLOR. Если зажим равен GL_TRUE, считывание цветного ограничения включено; если зажим равен GL_FALSE, считывание цветовой фиксации отключено. Если зажим равен GL_FIXED_ONLY, цветовая фиксация считывания включена, только если выбранный буфер считывания имеет компоненты с фиксированной запятой и отключен в противном случае. & Quot;

Ваш ответ на вопрос