Помимо того, как извлекаются текселы, какие различия существуют между 2D- и 3D-текстурами?

Я занимаюсь переносом приложения OpenGL в Интернет и обнаружил, что WebGL 1.0 не поддерживает 3D-текстуры (будет поддерживаться в версии 2.0). Я использую текстуры 16 x 16 x 16 для информации о цвете некоторых простых моделей (для блочного вида).

Теперь, без поддержки 3D-моделей, я понял, что вместо этого могу распределить 16 слоев на плоскости 4 x 4, вот так:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

0 = layer

В результате получается "псевдо-3D" текстура 64 x 64.

Это приводит меня к моему вопросу: в чем разница между 3D- и 2D-текстурами на графических процессорах? И в ситуации, когда 2D-текстура может использоваться вместо 3D-текстуры (как в моем примере), будет ли разница в производительности между ними?

Я предполагаю, что 3D-текстуры имеют аппаратную поддержку интерполяции по оси Z, тогда как для 2D-текстуры потребуются две выборки текселей и ручная интерполяция между ними для того же результата.


person Fault    schedule 14.03.2014    source источник
comment
Вот ответ с кодом для эмуляции 3D-текстур с 2D-текстурами. stackoverflow.com/questions/19939557/ Я думаю, гораздо быстрее использовать 3D-текстуры, когда они существуют. Почему бы не время?   -  person gman    schedule 15.03.2014


Ответы (1)


Вы правы, самая большая разница, которая сразу приходит мне на ум, связана с фильтрацией текстур в 3D и 2D. Линейная фильтрация должна отбирать 4 текселя (при условии, что это 2D-изображение), если координата текстуры не находится точно в центре текселя, а затем выполнять взвешенное усреднение на основе расстояния, на котором находится выборка от каждого из выбранных текселей. Это настолько фундаментальная операция, что аппаратное обеспечение создано специально для этого (более новое аппаратное обеспечение даже позволяет вам воспользоваться этим в виде инструкций, таких как gather4).

Вы можете реализовать линейную фильтрацию самостоятельно (и на самом деле вам иногда приходится это делать для таких вещей, как мультисэмплированные текстуры), если вы используете фильтр ближайшего соседа и вычисляете весовой коэффициент и т. д. самостоятельно, но это всегда будет медленнее, чем аппаратная реализация.

В вашем случае, если вы хотите реализовать линейную фильтрацию 3D-текстуры, вам фактически придется сэмплировать 8 текселей (23 для обработки интерполяции во всех трех измерениях). Очевидно, что аппаратное обеспечение ориентировано на работу с 2D-текстурами, так как инструкции gather8 нет... но вы можете поспорить, что встроенная линейная интерполяция будет быстрее, чем ваш ручной хак.

WebGL даже не предоставляет gather4/textureGather (поскольку это функция DX10.1/GL4), но аппаратное обеспечение работало таким образом долго до того, как это стало инструкцией, которую можно было использовать в шейдер.


Возможно, вам удастся найти компромисс, если вы сообразительны, когда вы используете аппаратные возможности линейной фильтрации для фильтрации в направлениях S и T каждого 2D-среза, а затем выполняете свою собственную линейную фильтрацию между срезами (R). Однако вам нужно быть осторожным при работе с текселями на краю изображения. Убедитесь, что между изображениями срезов в виртуальной 3D-текстуре имеется граница не менее 1 текселя, чтобы аппаратное обеспечение не выполняло интерполяцию между срезами.

person Andon M. Coleman    schedule 14.03.2014