Проблемы глубины + трафаретного фреймбуфера

Мне нужен и трафарет, и буфер глубины для моего приложения OpenGL. Буфер глубины, по крайней мере, должен быть визуализирован в текстуру через объект framebuffer, чтобы я мог делать отложенное затенение и другие эффекты постобработки. Я уже настроил этот фрейм-буфер (используя GL_DEPTH24_STENCIL8), но у меня есть некоторые проблемы и вопросы.

Во-первых, я хотел бы использовать 32-битный буфер глубины с плавающей точкой. Опция GL_DEPTH32F_STENCIL8 представляется наиболее очевидной. Я хотел бы знать, что такое фактический объем памяти этого формата? Логически это будет 40 бит, но, зная, что я делаю с выравниванием, меня не удивит, если они добавят его до 64, и многие источники говорят, что именно так и происходит. Я хотел бы знать наверняка.

Возможно, лучше было бы хранить буферы глубины и трафарета отдельно? Должен ли я беспокоиться о том, что это не поддерживается? Как насчет эффективности кэша, так как тесты трафарета и глубины часто выполняются вместе?

PS. Я не использую мультисэмплинг.

1

Решение

GL_DEPTH32F_STENCIL8 это 64-битный формат; 32-разрядный для глубины, 8-разрядный для трафарета и 24-разрядный для выравнивания.

Иногда полезно знать оба графических API-интерфейса для настольных компьютеров, поскольку это тот же формат, который был добавлен в D3D10. D3D значительно облегчает понимание размера его форматов, просто взглянув на их название.

В D3D формат известен как DXGI_FORMAT_D32_FLOAT_S8X24_UINT:

   D32_FLOAT указывает, что он хранит 32-битную глубину (с плавающей точкой)

   S8X24_UINT указывает, что он хранит 8-битный трафарет + 24-битный неиспользованный (целое число без знака)

D3D хорош тем, что форматы явно объявляют, когда есть неиспользуемые биты для заполнения (это то, что Xn в формате указывает). Нет цветопередачи 8-бит RGB формат в D3D, потому что это портит выравнивание; они все RGBX или некоторая перестановка 4 для получения 32-битного пикселя.


Чтобы дать вам достоверный ответ, я отошлю вас к расширению, которое первым добавило этот формат в GL:

GL_ARB_depth_buffer_float

обзор

[…]

Кроме того, это расширение предоставляет новые упакованные форматы пикселей глубины / трафарета (см. EXT_packed_depth_stencil) который имеет 64-битные пиксели состоящий из 32-битное значение глубины с плавающей точкой, 8 бит трафарета, а также 24 неиспользованных бита. Внутренний формат упакованной текстуры глубины / трафарета также предоставляется.

3

Другие решения

У меня нет ответа на ваш вопрос об объеме памяти в формате (я думаю, что вы можете найти его где-то еще), но я бы предложил использовать RenderBuffer вместо Framebuffer для части Depth Stencil вашего Deferred Shading: Какова концепция и различия между Framebuffer и Renderbuffer в OpenGL?

0

По вопросам рекламы [email protected]