Можно ли не зажимать данные при использовании glReadPixels? - PullRequest
2 голосов
/ 24 апреля 2019

Я пытаюсь разработать код, в котором я загружаю 3d-модель с помощью assimp, выполняю операции с трехмерными координатами и нормалями вершин, а затем хочу получить свои текстуры в ЦП.

Я пытался использовать«glReadPixels» для извлечения текстур, но мои данные оказываются зажаты между [0 1], как они описывают в здесь .

Пример текстур, которые я использую:

    glGenTextures(1, &pos3d);
    glBindTexture(GL_TEXTURE_2D, pos3d);
    glViewport(0, 0, width, height);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + gpos3dLayout, GL_TEXTURE_2D, pos3d, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

И затем я получаю, используя это:

    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, pos3d);
    glReadBuffer(GL_COLOR_ATTACHMENT0);
    std::vector<GLfloat> positions3d(width * height * 4); // 4 because of RGBA * 1 float
    glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &positions3d[0]);

Как я уже сказал, мои значения, кажется, зажаты между 0 и 1. Так есть ли способ отключить это ограничение?

1 Ответ

2 голосов
/ 24 апреля 2019

Данные ограничены, потому что внутренний формат текстуры, которая прикреплена к цветовой плоскости кадрового буфера, равен GL_RGBA (что совпадает с GL_RGBA8).Этот формат является нормализованным форматом с фиксированной запятой без знака и обеспечивает 8 битов для каждого цветового канала, где 0 представляет 0,0, а все 8 установленных битов (255) представляют 1,0.
Это приводит к тому, что представление данных в хранилище данныхтекстура зажата.glReadPixels считывает данные из хранилища данных, которое прикреплено к цветовой плоскости фрамбуфера.

Измените внутренний формат текстуры на формат с плавающей запятой (например, GL_RGBA16F), при указании двумерного изображения текстуры с помощью glTexImage2D:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

Когда пиксель считывается из буфера, он может быть зафиксирован в диапазоне[0,0, 1,0].Это зависит от настройки glClampColor.

См. Спецификация профиля ядра API OpenGL 4.6 - 18.2.8 Окончательное преобразование , стр. 535

Считывание цветового ограничения контролируется вызовом

void ClampColor( enum target, enum clamp )

с целью, установленной на CLAMP_READ_COLOR.Если зажим равен TRUE, считывание цветного зажима включено;если зажим равен FALSE, считывание цветовой фиксации отключено.[...]
Для цвета RGBA с плавающей точкой, если типом является FLOAT или HALF_FLOAT, каждый компонент фиксируется на [0, 1], если включено считывание считывания цветов.

Обратите внимание, что в OpenGL ES цвета ограничены в любом случае.


glGetTexImage предоставляется только для настольных компьютеров OpenGL и не сжимает цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...