пятница, августа 05, 2005

Что будет, если поставить текстуру в NULL?

Это вольный перевод поста What happens when I set a texture to NULL?. Свои комментарии я указала в квадратных скобочках.

Вообще возможны варианты. Есть то, что должно случиться; то, что случается часто; то, что случается еще чаще и чего следует ожидать. Так что давайте по порядку.

Что должно случиться
Согласно исходниками референсного растеризатора [речь идет о программе, которая входит в состав DirectX SDK и делает софтверный рендеринг точно так, как это подразумевает API без каких-либо оптимизаций и т.п.], если вы читаете какой-либо тексел из NULL-текстуры, вы должны получить непрозрачный черный. То есть RGB=0.0, а alpha=1.0.
Однако, если вы используете конвейер TextureStageState [TSS] (то есть не пиксельный шейдер), и D3DTS_ARG1 установлен в D3DTA_TEXTURE, то этот TSS устанавливается в D3DTOP_DISABLE и это означает, что и все последующие шаги (в смысле TSS'ы) будут пропущены. Обратите внимание, что будет, если ARG2 установлен в TEXTURE - тогда вы получаете непрозрачный черный и на этом шаге делается то, что и должно было делаться. Несколько странно, но уж как есть.
Помните - это согласно вышеупомянутым исходникам и, в теории, это есть официальная точка зрения. Но вы читайте дальше...

Что случается часто
Некоторые карточки ту часть, что касается непрозрачного черного, воспринимают правильно, но игнорируют ту часть, что касается отключения TSS. То есть вы получите нормальную работу TSS.

Что случается еще чаще
Большинство карт следуют стандарту OpenGL, который это трактует как непрозрачный белый. И также игнорируется часть относительно TSS. [Я видела такое поведение на GeForce4 и GeForce6800.]
Еще одно часто встречающееся поведение - случайные данные в текстуре.

Чего следует ожидать
Ничего. То есть вообще ничего. Спецификация D3D менялась несколько раз, драйверы меняются постоянно, различные производители все делают по-разному, и, честно говоря, случиться может все, что угодно. Результат установки текстуры в NULL действительно может быть непредсказуем. Лучший совет: не делайте этого. Пишите свои пиксельные шейдеры и TSS'ы, чтобы они делали только то, что должны и ничего более. Если это значит, что вам нужны другие шейдеры/TSS'ы на случай NULL-текстуры, напишите их. Обычно эти шейдеры/TSS'ы будут работать гораздо быстрее, чем использующие NULL-текстуру и точно будут более предсказуемы.


Technorati tag: