Michał Borek

Tech blog

Scala – Ray Tracing – bump mapping

Kolejną rzeczą, jaką dodałem do ray tracera jest bump mapping. Aktualnie silnik obsługuje zarówno bump mapping proceduralny, jak i oparty o tekstury. Definiowanie parametrów określonego shadera jest jeszcze jednak dość skomplikowane.

Mam też niewielki błąd (szumy) na krawędziach obiektów, co jest moim kolejnym zadaniem w tym projekcie.

Poniżej mały sample z bumpem i różnymi właściwościami powierzchni (połyskliwość).

Bump mapping

Scala – ray tracing – tekstury

Nie trzeba było długo czekać, a projekt raytracera w Scali doczekał się małej aktualizacji.

Dodane zostało teksturowanie.

Za mapowanie tekstury odpowiada następujący fragment kodu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def getTexel(vp: Vector): Color = {
    hasTexture match {
        case false => color
        case true =>
            val vn = new Vector(0,-1,0)
            val ve = new Vector(-1,0,0)
            val phi = Math.acos(-vn.dot(vp))
            val v = phi / Math.Pi
            val theta = (Math.acos(vp.dot(ve) / Math.sin(phi))) / (2 * Math.Pi)
            val u = vn.crossProduct(ve).dot(vp) > 0 match {
                case true => theta
                case false => 1 - theta
            }
            val color = new java.awt.Color(
                textureFile.getRGB(((u * _textureScale * textureFile.getWidth + _tPosX) % (textureFile.getWidth - 1)) .toInt, ((v * _textureScale * textureFile.getHeight + _tPosY) % (textureFile.getHeight - 1)).toInt))
            new Color(color.getRed / 255.0, color.getGreen / 255.0, color.getBlue / 255.0)
        }
    }

Efekt załączony na poniższym rysunku:

Tekstury

Ray tracing w języku Scala

Kolejnym podejściem do ray tracingu jest implementacja prostego silnika ray tracera w Scali.

Scala jest językiem funkcyjnym, działającym na wirtualnej maszynie Javy. Fajnie integruje się ze standardowymi klasami Javy, co znacznie zwiększa jego funkcjonalność.

Silnik obsługuje na razie tylko prosty model oświetlenia Phonga oraz przecinanie promienia jedynie z kulami.

Zamierzam dopisać do tego bump mapping, ale z czasem może być krucho i na zamiarach może się skończyć 🙂

Poniżej przykład wygenerowanego obrazu (zamierzam sprawić, że będzie to bardziej spektakularne :))

Scala Ray Tracing