При использовании GL_RGBA16F_ARB-текстура, она содержит только дерьмо, но я не получаю сообщение об ошибке - PullRequest
1 голос
/ 12 марта 2009

Я генерирую текстуру, подобную этой:

GLuint id;

glGenTextures(1, &id);

glBindTexture(GL_TEXTURE_2D, id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(
    GL_TEXTURE_2D, 0,
    GL_RGBA16,
    //GL_RGBA16F_ARB, //< Won't work
    256, 256, 0, GL_RGBA, GL_FLOAT, NULL
);

glBindTexture(GL_TEXTURE_2D, 0);

Я прикрепляю его к объекту кадрового буфера (FBO) для рендеринга в. Все это работает как очарование, когда я устанавливаю внутренний формат GL_RGBA16. Однако мне нужен более высокий динамический диапазон, и я подумал, что GL_RGBA16F_ARB может помочь.

К сожалению, если я заменю GL_RGBA16 на GL_RGBA16F_ARB в приведенном выше коде, текстура перестает работать. Я ничего не пытаюсь рендерить на FBO / текстуры, и когда я использую текстуру, она содержит случайный мусор. (Как оказалось, много фиолетового) Это было бы не так печально, если бы я получил сообщение об ошибке, намекающее на то, что может быть не так, но, похоже, я не могу его найти. Другими словами, glGetError() возвращает 0 после glTexImage2D -коллока, а glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) возвращает GL_FRAMEBUFFER_COMPLETE_EXT, когда я прикрепил текстуру

Я не связывался с glClampColorARB(...) ... пока:)

  1. Я забыл проверить ошибки в месте / пути, о котором я не думал?
  2. Требует ли GL_RGBA16F_ARB -текстура какой-либо специальной обработки, которую я не давал?
  3. Есть что-нибудь еще, что может быть не так?

Я в тупике, так как все работает с GL_RGBA16 ...: (

РЕДАКТИРОВАТЬ: При использовании GL_RGBA16F_ARB первый кадр, который я пытаюсь отобразить на экране, не делает это. Сдается мне, что я должен получить сообщение об ошибке где-то ..?

EDIT: Изучив пример рабочего кода ShadowIce, я обнаружил, что проблемы исчезли, если я изменил буфер глубины на моем FBO и дал glRenderBufferStorageEXT(...) GL_DEPTH_COMPONENT24 в качестве его второй параметр, а не GL_DEPTH_COMPONENT16. Я не знаю, , почему это работает, но, видимо, это работает.

Кроме того, код ShadowIce ломается, как мой, если я делаю там противоположную подстановку.

Ответы [ 2 ]

4 голосов
/ 13 марта 2009

Не должно быть ничего особенного для настройки кадрового буфера с плавающими текстурами. Некоторые вещи, которые я бы проверил:

  1. Правильно ли установлены FBO и правильно настроен буфер рисования / чтения перед вызовом glCheckFramebufferStatusEXT? Также попробуйте проверить это прямо перед тем, как рисовать.
  2. Хорошо ли выглядит текстура после простого glClear с определенным чистым цветом? Если да, возможно, что-то не так с вашими шейдерами (если вы их используете) или с тем, как вы рисуете в FBO.
  3. Ваши драйверы обновлены? И проблема все еще существует на ПК с другим оборудованием?
  4. Как насчет GL_RGBA32F_ARB?

Изменить:

  1. Проверьте идентификатор вашего кадрового буфера и текстуры, а также проверьте, совпадает ли идентификатор текстуры с идентификатором, прикрепленным к вашему fbo (с glGetFramebufferAttachmentParameteriv). Обычно я думаю, что с этим все в порядке, если он работает с текстурой RGBA, но случайные данные (особенно фиолетовые) являются хорошим признаком того, что в текстуру ничего не было записано или она не была очищена должным образом.

Я написал небольшой пример приложения, которое должно работать, может быть, это поможет. Я тестировал его только на Windows, поэтому для Linux вам может потребоваться немного изменить его: ссылка

1 голос
/ 13 марта 2009

GL_HALF_FLOAT_ARB может работать как тип вместо GL_FLOAT.

...