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ść).
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:
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 :))