Udostępnij za pośrednictwem


Mapowanie środowiska sześciennego (Direct3D 9)

Mapy środowiska sześciennego — czasami nazywane mapami modułów — to tekstury zawierające dane obrazu reprezentujące scenę wokół obiektu, tak jakby obiekt znajdował się w środku modułu. Każda ściana mapy sześciennej środowiska obejmuje kąt widzenia 90 stopni w poziomie i pionie, a każda mapa sześcienna zawiera sześć ścian. Orientacja twarzy jest pokazana na poniższej ilustracji.

ilustracja modułu z osiami współrzędnymi centralnymi prostopadłymi do ścian sześcianu

Każda twarz sześcianu jest zorientowana prostopadle do płaszczyzny x/y, y/z lub x/z w przestrzeni światowej. Na poniższej ilustracji pokazano, jak każda płaszczyzna odpowiada twarzy.

ilustracja twarzy modułu ze współrzędnymi projekcjami płaszczyzn

Mapy środowiska sześciennego są implementowane jako seria obiektów tekstury. Aplikacje mogą używać statycznych obrazów do mapowania środowiska sześciennego lub tworzyć je na powierzchniach mapy sześciennej, aby wykonać dynamiczne mapowanie środowiska. Ta technika wymaga, aby powierzchnie mapy kostki stały się prawidłowymi powierzchniami docelowymi renderowania, utworzonymi przy użyciu zestawu flag D3DUSAGE_RENDERTARGET.

Twarze mapy sześcianu nie muszą zawierać bardzo szczegółowych renderunków otaczającej sceny. W większości przypadków mapy środowiskowe są stosowane do zakrzywionych powierzchni. Biorąc pod uwagę ilość krzywizny używanej przez większość aplikacji, wynikowe zniekształcenie odbić powoduje, że bardzo szczegółowa mapa środowiska staje się zbędna pod względem zużycia pamięci i obciążenia renderowania.

Mapy środowiska sześciennego mipmapped

Mapy sześcienne mogą być mipmapped. Aby utworzyć mapę sześcianową mipmapped, ustaw parametr Levels metody CreateCubeTexture do liczby poziomów, jaką chcesz. Można wyobrazić sobie topografię tych powierzchni, jak pokazano na poniższym diagramie.

diagram mapy modułu mipmapped z n poziomów mip

Aplikacje tworzące mapy środowiska sześciennego mipmapped mogą uzyskiwać dostęp do każdej twarzy, wywołując metodę GetCubeMapSurface. Zacznij od ustawienia odpowiedniej wartości z typu D3DCUBEMAP_FACES wyliczonego, zgodnie z opisem w Tworzenie powierzchni mapy środowiska sześciennego (Direct3D 9). Następnie wybierz poziom do pobrania, ustawiając parametr GetCubeMapSurface na żądany poziom mipmap. Pamiętaj, że wartość 0 odpowiada obrazowi najwyższego poziomu.

Współrzędne tekstury dla map środowiskowych sześciennych

Współrzędne tekstury indeksujące mapę środowiska sześciennego nie są prostymi współrzędnymi typu u, v, jak są stosowane podczas stosowania tekstur standardowych. W rzeczywistości mapy środowiska sześciennego w ogóle nie używają współrzędnych tekstury. Zamiast zestawu współrzędnych tekstury mapy środowiska sześciennego wymagają wektora 3D. Należy zadbać o określenie odpowiedniego formatu wierzchołka. Oprócz informowania systemu o tylu zestawach współrzędnych tekstury używanych przez aplikację należy podać informacje o tylu elementach w każdym zestawie. W tym celu Direct3D oferuje zestaw makr D3DFVF_TEXCOORDSIZEN. Te makra akceptują pojedynczy parametr, identyfikując indeks zestawu współrzędnych tekstury, dla którego opisano rozmiar. W przypadku wektora 3D należy uwzględnić wzorzec bitowy utworzony przez makro D3DFVF_TEXCOORDSIZE3. Poniższy przykład kodu przedstawia sposób użycia tego makra.

// 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); 

W niektórych przypadkach, takich jak mapowanie światła rozproszonego, używasz wierzchołka przestrzeni aparatu normalnego dla wektora. W innych przypadkach, takich jak mapowanie środowiska widmowego, należy użyć wektora odbicia. Ponieważ przekształcone wektory normalne są powszechnie zrozumiałe, informacje w tym miejscu koncentrują się na przetwarzaniu wektora odbicia.

Obliczanie wektora odbicia samodzielnie wymaga zrozumienia położenia każdego wierzchołka i wektora z punktu widzenia do tego wierzchołka. Direct3D może automatycznie obliczać wektory odbicia dla Twojej geometrii. Użycie tej funkcji powoduje zapisanie pamięci, ponieważ nie trzeba uwzględniać współrzędnych tekstury dla mapy środowiska. Zmniejsza również przepustowość, a w przypadku urządzenia T&L HAL może być znacznie szybsze niż obliczenia, które aplikacja może wykonać samodzielnie. Aby użyć tej funkcji, w etapie tekstury zawierającym mapę środowiska sześciennego, ustaw stan etapu tekstury D3DTSS_TEXCOORDINDEX na kombinację elementu D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR D3DTEXTURESTAGESTATETYPE oraz indeksu zestawu współrzędnych tekstury. W niektórych sytuacjach, takich jak mapowanie światła rozproszonego, można użyć elementu D3DTSS_TCI_CAMERASPACENORMAL D3DTEXTURESTAGESTATETYPE, co powoduje, że system używa przekształconej przestrzeni kamery, wierzchołka normalnego jako wektor adresowania tekstury. Indeks jest używany tylko przez system do określania trybu obwijania tekstury.

W poniższym przykładzie kodu pokazano, jak ta wartość jest używana.

// 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); 

Po włączeniu automatycznego generowania współrzędnych tekstury system używa jednej z dwóch formuł do obliczenia wektora odbicia dla każdego wierzchołka. Gdy stan renderowania D3DRS_LOCALVIEWER jest ustawiony na wartość true, zostanie użyta następująca formuła.

formuła wektora odbicia (r = 2(exn)n-e)

W poprzedniej formule R jest wektorem odbicia obliczanym, E jest znormalizowanym wektorem położenie-oko, a N to normalny wierzchołek przestrzeni kamery.

Gdy stan renderowania D3DRS_LOCALVIEWER jest ustawiony na wartość FALSE, system używa następującej formuły.

formuła wektora odbicia (r = 2nzn-i)

Elementy R i N w tej formule są identyczne z poprzednią formułą. Element NZ jest przestrzenią światową z wierzchołka normalnego, a ja jest wektorem (0,0,1) nieskończenie odległego punktu widzenia. System używa wektora odbicia z dowolnej formuły, aby wybrać i adresować odpowiednią ścianę mapy sześciennej.

Notatka

W większości przypadków aplikacje powinny włączyć automatyczną normalizację wektorów normalnych wierzchołków. W tym celu ustaw D3DRS_NORMALIZENORMALS na PRAWDA. Jeśli nie włączysz tego stanu renderowania, wygląd mapy środowiska będzie znacząco inny niż można się spodziewać.

 

Dodatkowe informacje znajdują się w następującym temacie.

Mapowanie Środowiska