как использовать формат GL_RGB9_E5? - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь использовать формат GL_RGB9_E5 с 3D-текстурой. Для этого я создал простой тест для понимания использования формата. Почему-то я не получаю то, что ожидаю. Ниже приводится тестовая программа

GLuint texture;
const unsigned int depth = 1;
const unsigned int width = 7;
const unsigned int height = 3;

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
const float color[3] = { 0.0f, 0.5f, 0.0f };
const rgb9e5 uColor = float3_to_rgb9e5(color);

GLuint * t1 = (GLuint*)malloc(width*height*depth* sizeof(GLuint));
GLuint * t2 = (GLuint*)malloc(width*height*depth* sizeof(GLuint));
int index = 0;
for (int i = 0; i < depth; i++)
    for (int j = 0; j < width; j++)
        for (int k = 0; k < height; k++)
        {
            t1[index] = uColor.raw;
            index++;
        }

glTexImage3D(GL_TEXTURE_3D, 0,
    GL_RGB9_E5,
    width, height, depth, 0,
    GL_RGB,
    GL_UNSIGNED_INT,
    (void*)t1);

glGetTexImage(GL_TEXTURE_3D, 0, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, t2);

index = 0;
for (int i = 0; i < depth; i++)
    for (int j = 0; j < width; j++)
        for (int k = 0; k < height; k++)
        {
            rgb9e5 t;
            t.raw = t2[index];
            index++;
        }

То, что я ожидаю, это то, что когда-либо uColor.raw Я вставляю t1 Я получаю тот же необработанный цвет в t2 .

Я взял метод float3_to_rgb9e5 из Спецификация для GL_RGB9_E5 внизу вы можете найти код.

Было бы замечательно, если бы кто-нибудь дал мне пример того, как правильно его использовать или как это правильно делать.

1 Ответ

6 голосов
/ 15 апреля 2019
    GL_RGB,
    GL_UNSIGNED_INT,

Это означает, что вы передаете 3-канальные данные пикселей, где каждый канал является нормализованным 32-разрядным целым числом без знака. Но это не то, что вы на самом деле делаете.

Вы фактически передаете 3-канальные данные, которые упакованы в 32-разрядное целое число без знака, так что первые 5 бит представляют экспоненту с плавающей запятой, за которой следуют 3 набора по 9 бит, каждый из которых представляет неподписанную мантиссу поплавка. Мы пишем, что:

GL_RGB,
GL_UNSIGNED_INT_5_9_9_9_REV
...