Мне нужен и трафарет, и буфер глубины для моего приложения OpenGL. Буфер глубины, по крайней мере, должен быть визуализирован в текстуру через объект framebuffer, чтобы я мог делать отложенное затенение и другие эффекты постобработки. Я уже настроил этот фрейм-буфер (используя GL_DEPTH24_STENCIL8), но у меня есть некоторые проблемы и вопросы.
Во-первых, я хотел бы использовать 32-битный буфер глубины с плавающей точкой. Опция GL_DEPTH32F_STENCIL8 представляется наиболее очевидной. Я хотел бы знать, что такое фактический объем памяти этого формата? Логически это будет 40 бит, но, зная, что я делаю с выравниванием, меня не удивит, если они добавят его до 64, и многие источники говорят, что именно так и происходит. Я хотел бы знать наверняка.
Возможно, лучше было бы хранить буферы глубины и трафарета отдельно? Должен ли я беспокоиться о том, что это не поддерживается? Как насчет эффективности кэша, так как тесты трафарета и глубины часто выполняются вместе?
PS. Я не использую мультисэмплинг.
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:
обзор
[…]Кроме того, это расширение предоставляет новые упакованные форматы пикселей глубины / трафарета (см. EXT_packed_depth_stencil) который имеет 64-битные пиксели состоящий из 32-битное значение глубины с плавающей точкой, 8 бит трафарета, а также 24 неиспользованных бита. Внутренний формат упакованной текстуры глубины / трафарета также предоставляется.
У меня нет ответа на ваш вопрос об объеме памяти в формате (я думаю, что вы можете найти его где-то еще), но я бы предложил использовать RenderBuffer вместо Framebuffer для части Depth Stencil вашего Deferred Shading: Какова концепция и различия между Framebuffer и Renderbuffer в OpenGL?