Detail Mapping

Aus DGL Wiki
Version vom 10. März 2009, 19:04 Uhr von DGLBot (Diskussion | Beiträge) (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)

Wechseln zu: Navigation, Suche

Was ist Detailmapping

Oftmals hat man in einer Szene Objekte auf denen eine recht grobe Textur haftet, und die daher feine Details missen lässt, was im echten Leben bei vielen Materialien jedoch sichtbar ist. Eine Möglichkeit Details in diese Textur zu bringen, wäre eben diese Textur sehr viel hochauflösender zu machen und die Details direkt in dieser abzulegen. Diese Methode hat jedoch den Nachteil dass man so sehr viel mehr Speicher braucht und die Details (z.B. kleine Risse in Gestein, Grasmuster auf Grastextur) fest sind für jedes Objekt das diese Textur nutzt.

Und genau da setzt Detailtexturing an : Da moderne Grafikkarten allesamt über mehrere Textureinheiten (siehe Multitexturing) verfügen, legt man in vergleichsweise hoher Wiederholung (z.B. Texturkoordinaten der Grundtextur * 16) eine Graustufentextur über die Grundtextur in der die Details dieser Oberfläche hinterlegt sind. Dies klappt deshalb, weil Details von Materialien wie z.B. Holz, Stein, Gras filigran und wiederholbar sind.

Eine besondere Form des Detailmappings sind sogenannte Decals.



Beispiel

Detailtex.jpg
Besonders bei der Darstellung von Gelände wird Detailtexturing genutzt. Denn hier hat man meist eine recht grob aufgelöste Terraintextur (Basistextur) die (siehe rechter Bildabschnitt) jedoch so gut wie keine Details erkennen lässt (man ist ja oft auf Texturgrößen <= 2k^n beschränkt, da lassen sich kaum Details in der Basistextur ablegen). Über diese legt man dann mittels Multitexturing in recht hoher Wiederholung die Graustufen-Detailtextur um so Details zu simulieren (siehe linker Bildabschnitt). Der Unterschied ist frapierend, kostet allerdings kaum Leistung. Besonders wenn der Nutzer das Terrain aus nächster Nähe betrachtet gibt es riesige Unterschiede.


Implementation

// Detailtextur auf Textureinheit 1 aktiveren
glClientActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, DetailTexture);

// Basistextur auf Textureinheit 0 aktiveren
glClientActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, BaseTexture);

// ...

// Alle Schnittpunkte des Objektes renderm
for v := 0 to High(VertexData) do
begin
  // ...

  // Texturkoordinate für die Detailtextur
  glMultiTexCoord2f(GL_TEXTURE1, Vertex[v].s*16, Vertex[v].t*16); 
  // Texturkoordinate für die Basistextur
  glMultiTexCoord2f(GL_TEXTURE0, Vertex[v].s, Vertex[v].t);

  // ...
end;

Siehe Auch

glBindTexture, glClientActiveTexture, glMultiTexCoord