| ... | ... |
@@ -36,31 +36,39 @@ struct Ray |
| 36 | 36 |
vec3 direction; |
| 37 | 37 |
}; |
| 38 | 38 |
|
| 39 |
+//// Material |
|
| 40 |
+struct Material |
|
| 41 |
+{
|
|
| 42 |
+ vec3 color; |
|
| 43 |
+}; |
|
| 44 |
+ |
|
| 39 | 45 |
//// Trace |
| 40 | 46 |
struct Trace |
| 41 | 47 |
{
|
| 42 |
- float distance; |
|
| 48 |
+ float distance; |
|
| 49 |
+ Material material; |
|
| 43 | 50 |
}; |
| 44 | 51 |
|
| 45 | 52 |
//// Circle |
| 46 | 53 |
struct Circle |
| 47 | 54 |
{
|
| 48 |
- vec3 center; |
|
| 49 |
- float radius; |
|
| 55 |
+ vec3 center; |
|
| 56 |
+ float radius; |
|
| 57 |
+ Material material; |
|
| 50 | 58 |
Trace trace(Ray const & ray) const |
| 51 | 59 |
{
|
| 52 | 60 |
auto const offs = center - ray.origin; |
| 53 | 61 |
auto const proj = dot(offs, ray.direction); |
| 54 | 62 |
if (proj < 0.0F) // Past. |
| 55 |
- return {infinity};
|
|
| 63 |
+ return {infinity, {}};
|
|
| 56 | 64 |
auto const perp2 = dot(offs, offs) - proj * proj; |
| 57 | 65 |
auto const pene2 = radius * radius - perp2; |
| 58 | 66 |
if (pene2 < 0.0F) // Miss. |
| 59 |
- return {infinity};
|
|
| 67 |
+ return {infinity, {}};
|
|
| 60 | 68 |
auto const dist = proj - sqrt(pene2); |
| 61 | 69 |
if (dist < 0.0F) // Inside. |
| 62 |
- return {infinity};
|
|
| 63 |
- return {dist};
|
|
| 70 |
+ return {infinity, {}};
|
|
| 71 |
+ return {dist, material};
|
|
| 64 | 72 |
} |
| 65 | 73 |
}; |
| 66 | 74 |
|
| ... | ... |
@@ -70,10 +78,11 @@ using Shapes = std::vector<Circle>; |
| 70 | 78 |
//// Scene |
| 71 | 79 |
struct Scene |
| 72 | 80 |
{
|
| 73 |
- Shapes shapes; |
|
| 81 |
+ Material background; |
|
| 82 |
+ Shapes shapes; |
|
| 74 | 83 |
Trace trace(Ray const & ray) const |
| 75 | 84 |
{
|
| 76 |
- auto nearest = Trace{infinity};
|
|
| 85 |
+ auto nearest = Trace{infinity, background};
|
|
| 77 | 86 |
for (auto const & shape : shapes) |
| 78 | 87 |
{
|
| 79 | 88 |
auto const trace = shape.trace(ray); |
| ... | ... |
@@ -181,12 +190,14 @@ int main(int argc, char const * argv[]) |
| 181 | 190 |
100.0F, // far |
| 182 | 191 |
}; |
| 183 | 192 |
auto const scene = Scene{
|
| 193 |
+ // background |
|
| 194 |
+ {vec3(0.2F, 0.2F, 0.5F)},
|
|
| 184 | 195 |
// shapes |
| 185 | 196 |
{
|
| 186 |
- {vec3( 2.0F, -1.0F, -10.0F), 3.0F},
|
|
| 187 |
- {vec3( 1.0F, 2.0F, -7.0F), 2.0F},
|
|
| 188 |
- {vec3(-1.0F, 0.0F, -4.0F), 1.0F},
|
|
| 189 |
- {vec3( 0.0F, -1.0F, -3.0F), 0.2F},
|
|
| 197 |
+ {vec3( 2.0F, -1.0F, -10.0F), 3.0F, {vec3(1.0F, 0.0F, 0.0F)}},
|
|
| 198 |
+ {vec3( 1.0F, 2.0F, -7.0F), 2.0F, {vec3(0.0F, 1.0F, 0.0F)}},
|
|
| 199 |
+ {vec3(-1.0F, 0.0F, -4.0F), 1.0F, {vec3(0.0F, 0.0F, 1.0F)}},
|
|
| 200 |
+ {vec3( 0.0F, -1.0F, -3.0F), 0.2F, {vec3(0.0F, 1.0F, 1.0F)}},
|
|
| 190 | 201 |
}, |
| 191 | 202 |
}; |
| 192 | 203 |
auto const tonemap = ACES{vec3(1.0F)};
|
| ... | ... |
@@ -195,7 +206,7 @@ int main(int argc, char const * argv[]) |
| 195 | 206 |
output.render([&](uvec2 const & size, uvec2 const & pixel) {
|
| 196 | 207 |
auto const ray = camera.ray(size, pixel); |
| 197 | 208 |
auto const trace = scene.trace(ray); |
| 198 |
- auto const rgb = vec3(min(trace.distance / 100.0F, 100.0F)); |
|
| 209 |
+ auto const rgb = trace.material.color; |
|
| 199 | 210 |
auto const srgb = convertLinearToSRGB(tonemap.transform(rgb)); |
| 200 | 211 |
auto const alpha = 1.0F; |
| 201 | 212 |
return vec4(srgb, alpha); |