Поделиться через


Сопоставление кубической среды (Direct3D 9)

Карты кубической среды , иногда называемые картами кубов, — это текстуры, содержащие данные изображения, представляющие сцену вокруг объекта, как если бы объект был в центре куба. Каждое лицо карты кубической среды охватывает 90-градусное поле представления в горизонтальной и вертикальной вертикали, и на карту куба приходится шесть лиц. Ориентация лиц показана на следующем рисунке.

illustration of a cube with central coordinate axes perpendicular to cube faces

Каждая грань куба ориентирована на перпендикулярную к плоскости x/y, y/z или x/z в мировом пространстве. На следующем рисунке показано, как каждая плоскость соответствует лицу.

illustration of cube faces with coordinate projections from planes

Карты кубической среды реализуются в виде ряда объектов текстур. Приложения могут использовать статические изображения для сопоставления кубических сред или могут отображаться на лицах карты куба для выполнения динамического сопоставления среды. Этот метод требует, чтобы поверхности карты куба были допустимыми поверхностями целевой отрисовки, созданными с помощью набора флагов D3DUSAGE_RENDERTARGET.

Лица карты куба не должны содержать чрезвычайно подробные отрисовки окружающей сцены. В большинстве случаев карты среды применяются к кривым поверхностям. Учитывая объем кривизны, используемой большинством приложений, результирующее искажение отражает крайнюю детализацию в схеме среды с точки зрения памяти и отрисовки затрат.

Карты кубической среды Mipmapped

Карты кубов можно использовать для mipmapped. Чтобы создать карту кубов mipmapped, задайте параметр Levels метода CreateCubeTexture на количество нужных уровней. Вы можете представить топологию этих поверхностей, как показано на следующей схеме.

diagram of a mipmapped cube map with n mip levels

Приложения, создающие карты кубической среды mipmapped, могут получить доступ к каждому лицу, вызвав метод GetCubeMapSurface . Начните с задания соответствующего значения из перечисленного типа D3DCUBEMAP_FACES, как описано в разделе "Создание поверхностей карты кубической среды" (Direct3D 9). Затем выберите уровень, который требуется получить, задав параметр уровня GetCubeMapSurface на нужный уровень mipmap. Помните, что 0 соответствует изображению верхнего уровня.

Координаты текстур для Карты кубической среды

Координаты текстуры, которые индексируют карту кубической среды, не простые координаты стиля u, как используется при применении стандартных текстур. На самом деле карты кубической среды вообще не используют координаты текстур. Вместо набора координат текстуры карты кубической среды требуют трехмерного вектора. Необходимо указать правильный формат вершин. Помимо того, чтобы сообщить системе, сколько наборов координат текстур использует приложение, необходимо указать сведения о количестве элементов в каждом наборе. 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, используется следующая формула.

formula of the reflection vector (r = 2(exn)n-e)

В приведенной выше формуле R является вектором отражения, E является нормализованным вектором положения к глазу, а N — нормальной вершиной пространства камеры.

Если для состояния отрисовки D3DRS_LOCALVIEWER задано значение FALSE, система использует следующую формулу.

formula of the reflection vector (r = 2nzn-i)

Элементы R и N в этой формуле идентичны предыдущей формуле. Элемент NZ является мировым пространством z нормальной вершины, и я вектор (0,0,1) бесконечно удаленной точки зрения. Система использует вектор отражения из любой формулы для выбора и адреса соответствующего лица карты куба.

Примечание.

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

 

Дополнительные сведения содержатся в следующем разделе.

Сопоставление среды