@@ -198,6 +198,12 @@ fn refract(ix: f64, iy: f64, nx: f64, ny: f64, eta: f64) -> Option<(f64, f64)> {
198
198
Some ( ( eta * ix - a * nx, eta * iy - a * ny) )
199
199
}
200
200
201
+ fn fresnel ( cosi : f64 , cost : f64 , etai : f64 , etat : f64 ) -> f64 {
202
+ let rs = ( etat * cosi - etai * cost) / ( etat * cosi + etai * cost) ;
203
+ let rp = ( etat * cost - etai * cosi) / ( etat * cost + etai * cosi) ;
204
+ ( rs * rs + rp * rp) * 0.5
205
+ }
206
+
201
207
fn trace ( ox : f64 , oy : f64 , dx : f64 , dy : f64 , depth : u32 ) -> f64 {
202
208
let mut t = 0.0 ;
203
209
let sign = if scene ( ox, oy) . sd > 0.0 {
@@ -225,6 +231,13 @@ fn trace(ox: f64, oy: f64, dx: f64, dy: f64, depth: u32) -> f64 {
225
231
} ;
226
232
match refract ( dx, dy, nx, ny, eta) {
227
233
Some ( ( rx, ry) ) => {
234
+ let cosi = -( dx * nx + dy * ny) ;
235
+ let cost = -( rx * nx + ry * ny) ;
236
+ refl = if sign < 0.0 {
237
+ fresnel ( cosi, cost, r. eta , 1.0 )
238
+ } else {
239
+ fresnel ( cosi, cost, 1.0 , r. eta )
240
+ } ;
228
241
sum += ( 1.0 - refl) * trace ( x - nx * BIAS , y - ny * BIAS , rx, ry, depth + 1 )
229
242
}
230
243
None => {
0 commit comments