Использование буфера глубины для целей рендеринга с плавающей точкой в ​​OpenGL 2.1 - PullRequest
2 голосов
/ 05 марта 2012

Я хотел бы использовать буфер глубины для хранения значений глубины частиц в пространстве глаза в 2D текстуре с использованием OpenGL 2.1 / GLSL 1.2.

Пока я нашел способ использовать цветовой буфер

// create texture
glGenTextures(1, &g_hDepthTexture);
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
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_RGBA32F_ARB, g_windowWidth, g_windowHeight, 0, GL_RGBA, GL_FLOAT, 0);
// create framebuffer
glGenFramebuffersEXT(1, &g_hFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO);glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_hDepthTexture, 0);

Однако мне не нужны компоненты BGA. Поэтому я попытался использовать буфер глубины, но следующий код ограничивает каждое значение в текстуре до 0 ... 1

// create texture
glGenTextures(1, &g_hDepthTexture);
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
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_DEPTH_COMPONENT, g_windowWidth, g_windowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);  // create framebuffer
glGenFramebuffersEXT(1, &g_hFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO);

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, g_hDepthTexture, 0);

Я хотел бы знать, как использовать буфер глубины (возможно, как выбрать правильный внутренний формат / формат), чтобы значения текстуры не фиксировались.

1 Ответ

1 голос
/ 05 марта 2012

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

Я бы предложил использовать фактический 1-канальный формат изображения с плавающей запятой, например GL_R32F.Может быть GL_R16F, в зависимости от того, сколько точности мне нужно.Если у вас нет оборудования GL 3.x, вы можете использовать GL_LUMINANCE32F_EXT, в зависимости от того, какие расширения доступны.

Кстати, если вы делаете это для отложенного рендеринга, небеспокоить.На самом деле вы можете вычислить точку пространства глаза непосредственно из обычного буфера глубины. Да, действительно .

...