Сопоставление кубической среды (Direct3D 9)
Карты кубической среды , иногда называемые картами кубов, — это текстуры, содержащие данные изображения, представляющие сцену вокруг объекта, как если бы объект был в центре куба. Каждая грань кубической карты охватывает 90-градусное поле зрения в горизонтальном и вертикальном направлениях, и в каждой кубической карте шесть граней. Ориентация лиц показана на следующем рисунке.
Каждая грань куба ориентирована перпендикулярно к плоскости x/y, y/z или x/z в мировых координатах. На следующем рисунке показано, как каждая плоскость соответствует лицу.
Карты кубической среды реализуются в виде ряда объектов текстур. Приложения могут использовать статические изображения для сопоставления кубических сред или могут производить отрисовку на гранях кубической карты для выполнения динамического сопоставления среды. Этот метод требует, чтобы поверхности кубической карты были допустимыми поверхностями для цели отрисовки, созданными с установленным флагом D3DUSAGE_RENDERTARGET.
Грани карты куба не должны содержать чрезвычайно подробные изображения окружающей сцены. В большинстве случаев карты среды применяются к кривым поверхностям. Учитывая степень кривизны, используемой большинством приложений, результирующее искажение отражения делает избыточной крайнюю детализацию в карте окружения с точки зрения использования памяти и затрат на отрисовку.
Карты кубической среды Mipmapped
Карты кубов можно использовать для mipmapped. Чтобы создать карту кубов mipmapped, задайте параметр Levels метода CreateCubeTexture число нужных уровней. Вы можете представить топологию этих поверхностей, как показано на следующей схеме.
схема
Приложения, создающие мипмапированные карты кубической среды, могут получить доступ к каждой грани, вызвав метод GetCubeMapSurface. Начните с задания соответствующего значения из перечисляемого типа D3DCUBEMAP_FACES, как обсуждается в Создание поверхностей кубической среды (Direct3D 9). Затем выберите уровень, который требуется получить, установив параметр уровня GetCubeMapSurface на желаемый уровень mipmap. Помните, что 0 соответствует изображению верхнего уровня.
Координаты текстур для карт кубической среды
Координаты текстуры, которые индексируют карту кубической среды, не являются простыми координатами стиля u и v, как те, что используются при применении стандартных текстур. На самом деле карты кубической среды вообще не используют координаты текстур. Вместо набора координат текстуры карты кубической среды требуют трехмерного вектора. Необходимо указать правильный формат вершин. Помимо того, чтобы сообщить системе, сколько наборов координат текстур использует приложение, необходимо указать сведения о количестве элементов в каждом наборе. Direct3D предлагает набор макросов D3DFVF_TEXCOORDSIZEN для этой цели. Эти макросы принимают один параметр, определяющий индекс набора координат текстуры, для которого описывается размер. В случае трехмерного вектора вы включаете битовый шаблон, созданный макросом D3DFVF_TEXCOORDSIZE3. В следующем примере кода показано, как используется этот макрос.
// Create a flexible vertex format descriptor for a vertex that contains
// a position, normal, and one set of 3D texture coordinates.
DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0);
В некоторых случаях, например диффузное сопоставление света, используется обычная вершина пространства камеры для вектора. В других случаях, таких как отображение зеркального окружения, используется вектор отражения. Так как преобразованные нормы вершин широко понимаются, информация здесь сосредоточена на вычислении вектора отражения.
Вычисление вектора отражения самостоятельно требует понимания положения каждой вершины и вектора с точки зрения к этой вершине. Direct3D может автоматически вычислять векторы отражения для геометрии. Использование этой функции сохраняет память, так как не требуется включать координаты текстур для карты среды. Это также снижает пропускную способность и, в случае устройства T&L HAL, это может быть значительно быстрее, чем вычисления, которые ваше приложение может выполнять самостоятельно. Чтобы использовать эту функцию, на этапе текстуры, содержащей карту кубической среды, задайте состояние стадии D3DTSS_TEXCOORDINDEX текстуры сочетанием элемента D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR D3DTEXTURESTAGESTATETYPE и индекса набора координат текстуры. В некоторых ситуациях, таких как диффузное сопоставление света, можно использовать элемент D3DTSS_TCI_CAMERASPACENORMAL D3DTEXTURESTAGESTATETYPE, что приводит к использованию вектора нормали вершины в пространстве камеры в качестве вектора адресации текстуры. Индекс используется системой только для определения режима упаковки текстуры.
В следующем примере кода показано, как используется это значение.
// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.
// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.
m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1);
При включении автоматического создания координат текстуры система использует одну из двух формул для вычисления вектора отражения для каждой вершины. Если для состояния D3DRS_LOCALVIEWER отрисовки задано значение TRUE, используется следующая формула.
В приведенной выше формуле R является вектором отражения, E является нормализованным вектором положения к глазу, а N — нормальной вершиной пространства камеры.
Если для состояния отрисовки D3DRS_LOCALVIEWER задано значение FALSE , система использует следующую формулу.
Элементы R и N в этой формуле идентичны предыдущей формуле. Элемент NZ является мировой координатой z нормали вершины, а вектор I — это вектор (0,0,1) при бесконечно большом удалении точки зрения. Система использует вектор отражения из любой формулы для выбора и обращения к соответствующей стороне кубической карты.
Заметка
В большинстве случаев приложения должны включать автоматическую нормализацию норм вершин. Для этого установите параметр D3DRS_NORMALIZENORMALS в значение TRUE. Если вы не включите это состояние отрисовки, внешний вид карты среды будет существенно отличаться от ожидаемого.
Дополнительные сведения содержатся в следующем разделе.
Связанные разделы