Delen via


Texture Wrapping (Direct3D 9)

Kortom, textuur wrapping verandert de basismethode waarop Direct3D getextureerde polygonen rastert met behulp van de textuurcoördinaten die zijn opgegeven voor elke vertex. Tijdens het rasteren van een veelhoek interpoleert het systeem tussen de patrooncoördinaten op elk van de hoekpunten van de veelhoek om de texelen te bepalen die voor elke pixel van de veelhoek moeten worden gebruikt. Normaal gesproken behandelt het systeem de textuur als een 2D-vlak, waarbij nieuwe texelen worden geïnterpoleerd door de kortste route te nemen van punt A binnen een textuur naar punt B. Als punt A de u, v-positie (0,8, 0.1) vertegenwoordigt en punt B zich bevindt op (0,1,0.1), ziet de interpolatielijn eruit als in het volgende diagram.

diagram van een interpolatielijn tussen twee punten

Houd er rekening mee dat de kortste afstand tussen A en B in deze afbeelding ongeveer door het midden van het patroon loopt. Als u-textuur- of v-textuurcoordinaat wrapping inschakelt, verandert de manier waarop Direct3D de kortste route tussen textuurcoördinaten in de u-richting en de v-richting interpreteert. Door textuur-wrapping zorgt de rasterizer per definitie voor de kortste route tussen textuurcoördinaatsets, waarbij ervan wordt uitgegaan dat 0,0 en 1,0 samenvallend zijn. Het laatste beetje is het lastige onderdeel: U kunt zich voorstellen dat het inschakelen van textuur omwikkeling in één richting ervoor zorgt dat het systeem een textuur behandelt alsof deze om een cilinder gewikkeld is. Denk bijvoorbeeld aan het volgende diagram.

diagram van een patroon en twee punten rond een cilinder

In de voorgaande afbeelding ziet u hoe wrapping in de u - richting van invloed is op hoe het systeem patrooncoördinaten interpoleert. Als u dezelfde punten gebruikt als in het voorbeeld voor normale of niet-uitgepakte patronen, ziet u dat de kortste route tussen punten A en B zich niet meer in het midden van het patroon bevindt; Het is nu over de grens waar 0,0 en 1.0 samen bestaan. Wrapping in de v-richting is vergelijkbaar, behalve dat het de textuur rond een cilinder verpakt die aan de zijkant ligt. Wrapping in zowel de u-richting als de v-richting is ingewikkelder. In deze situatie kunt u de textuur zien als een torus of ring.

De meest voorkomende praktische toepassing voor texture wrapping is het uitvoeren van omgevingstoewijzing. Meestal lijkt een object dat is getextureerd met een omgevingskaart zeer reflecterend, en toont het een gespiegelde afbeelding van de omgeving van het object in de scène. Maak voor deze discussie een kamer met vier muren, elk met een letter R, G, B, Y en de bijbehorende kleuren: rood, groen, blauw en geel. De omgevingskaart voor een dergelijke eenvoudige ruimte kan eruitzien als de volgende afbeelding.

illustratie van verticale strepen rood, groen, blauw en geel

Stel dat het plafond van de kamer wordt vastgehouden door een perfect reflecterende, vierzijdige pijler. Het toewijzen van het patroon van de omgevingskaart aan de pijler is eenvoudig; de pijler eruit laten zien alsof deze de letters en kleuren reflecteert, is niet zo eenvoudig. In het volgende diagram ziet u een draadframe van de pijler met de toepasselijke patrooncoördinaten in de buurt van de bovenste hoekpunten. De naad waar de wikkeling de randen van het patroon kruist, wordt weergegeven met een stippellijn.

diagram van een rechthoek met een stippellijn

Als wrapping is ingeschakeld in de u-richting, toont de getextureerde pijler de kleuren en symbolen van de omgevingskaart op de juiste wijze en kiest de rasterizer op de juiste manier de kortste route tussen de textuurcoördinaten, ervan uitgaande dat u-coördinaten 0.0 en 1.0 dezelfde locatie delen. De getextureerde zuil ziet eruit als de volgende afbeelding.

illustratie van een pijler die bestaat uit rode, groene, blauwe en gele kwadranten

Als textuurverpakking niet is ingeschakeld, interpoleert de rasterizer niet in de richting die nodig is om een geloofwaardige, weerspiegelde afbeelding te genereren. In plaats daarvan bevat het gebied aan de voorzijde van de pijler een horizontaal gecomprimeerde versie van de texels tussen u-coördinaten 0.175 en 0,875, terwijl ze door het midden van de textuur gaan. Het wrap-effect is verpest.

Textuur verpakking gebruiken

Als u texture wrapping wilt inschakelen, roept u de methode IDirect3DDevice9::SetRenderState aan, zoals wordt weergegeven in het onderstaande codevoorbeeld.

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

De eerste parameter die wordt geaccepteerd door IDirect3DDevice9::SetRenderState is een weergavestatus die moet worden ingesteld. Geef een van de geënumererde waarden D3DRS_WRAP0 tot en met D3DRS_WRAP7 op, waarmee wordt aangegeven voor welk textuurniveau de wrapping moet worden ingesteld. Geef de D3DWRAPCOORD_0 tot D3DWRAPCOORD_3 vlaggen in de tweede parameter op om textuur omvouwen in de bijbehorende richting in te schakelen, of combineer ze om omvouwen in meerdere richtingen in te schakelen. Als u een indicator weglaat, wordt textuurverpakking in de bijbehorende richting uitgeschakeld. Als u textuurherhaling wilt uitschakelen voor een set textuurcoördinaten, stelt u de waarde voor de corresponderende weergavestatus in op 0.

Verwar textuur wrap niet met de vergelijkbare textuuradresseringsmodi. Textuurverpakking wordt uitgevoerd voordat textuuradressering wordt toegepast. Zorg ervoor dat de patroonterugloopgegevens geen patrooncoördinaten bevatten buiten het bereik van [0.0, 1.0] omdat dit niet-gedefinieerde resultaten oplevert. Zie Textuuradresseringsmodi (Direct3D 9)voor meer informatie over textuuradressering.

Verplaatsingskaartterugloop

Verplaatsingskaarten worden geïnterpoleerd door de tessellatiemotor. Omdat de wrapmodus niet kan worden opgegeven voor de tesselatie-engine, kan textuurwikkeling niet worden uitgevoerd met displacement maps. Een toepassing kan een set vertices gebruiken die ervoor zorgt dat de interpolatie in elke richting wordt omsloten. De toepassing kan ook de interpolatie opgeven die moet worden uitgevoerd als een eenvoudige lineaire interpolatie.

Direct3D-patronen