... | ... |
@@ -25,8 +25,9 @@ auto const infinity = std::numeric_limits<float>::infinity(); |
25 | 25 |
//// Ray |
26 | 26 |
struct Ray |
27 | 27 |
{ |
28 |
- vec3 origin; |
|
29 |
- vec3 direction; |
|
28 |
+ vec3 origin; |
|
29 |
+ vec3 direction; |
|
30 |
+ float range; |
|
30 | 31 |
}; |
31 | 32 |
|
32 | 33 |
//// Trace |
... | ... |
@@ -74,7 +75,7 @@ struct Scene |
74 | 75 |
for (auto const & shape : shapes) |
75 | 76 |
{ |
76 | 77 |
auto const trace = shape.trace(ray); |
77 |
- if (trace.distance < nearest.distance) |
|
78 |
+ if (trace.distance < min(nearest.distance, ray.range)) |
|
78 | 79 |
nearest = trace; |
79 | 80 |
} |
80 | 81 |
return nearest; |
... | ... |
@@ -84,6 +85,8 @@ struct Scene |
84 | 85 |
//// Camera |
85 | 86 |
struct Camera |
86 | 87 |
{ |
88 |
+ float near; |
|
89 |
+ float far; |
|
87 | 90 |
uvec2 size; |
88 | 91 |
Ray ray(vec4 const & frag_coord) const |
89 | 92 |
{ |
... | ... |
@@ -91,9 +94,11 @@ struct Camera |
91 | 94 |
(2.0F * vec2(frag_coord.xy) - vec2(size)) / float(size.y), |
92 | 95 |
-1.0F |
93 | 96 |
); |
94 |
- auto const origin = vec3(0.0F); |
|
95 |
- auto const direction = normalize(point); |
|
96 |
- return Ray{origin, direction}; |
|
97 |
+ auto const origin = near * point; |
|
98 |
+ auto const stop = far * point; |
|
99 |
+ auto const range = length(stop - origin); |
|
100 |
+ auto const direction = (stop - origin) / range; |
|
101 |
+ return Ray{origin, direction, range}; |
|
97 | 102 |
} |
98 | 103 |
}; |
99 | 104 |
|
... | ... |
@@ -159,8 +164,12 @@ int main(int argc, char const * argv[]) |
159 | 164 |
//// Configure |
160 | 165 |
auto size = uvec2(640, 480); |
161 | 166 |
auto framebuffer = Framebuffer(size); |
162 |
- auto camera = Camera{size}; |
|
163 |
- auto scene = Scene{ |
|
167 |
+ auto camera = Camera{ |
|
168 |
+ 1.0F, // near |
|
169 |
+ 100.0F, // far |
|
170 |
+ size, // size |
|
171 |
+ }; |
|
172 |
+ auto scene = Scene{ |
|
164 | 173 |
{ // shapes |
165 | 174 |
Sphere{{ 6.0F, -4.0F, -24.0F}, 12.0F}, |
166 | 175 |
Sphere{{ 2.0F, 6.0F, -16.0F}, 8.0F}, |