@@ -82,8 +82,8 @@ namespace cg::renderer
82
82
class raytracer
83
83
{
84
84
public:
85
- raytracer (){};
86
- ~raytracer (){};
85
+ raytracer () {};
86
+ ~raytracer () {};
87
87
88
88
void set_render_target (std::shared_ptr<resource<RT>> in_render_target);
89
89
void clear_render_target (const RT& in_clear_value);
@@ -122,22 +122,25 @@ namespace cg::renderer
122
122
inline void raytracer<VB, RT>::set_render_target(
123
123
std::shared_ptr<resource<RT>> in_render_target)
124
124
{
125
- // TODO Lab: 2.01 Implement `set_render_target`, `set_viewport`, and `clear_render_target` methods of `raytracer` class
125
+ render_target = in_render_target;
126
126
}
127
127
128
128
template <typename VB, typename RT>
129
129
inline void raytracer<VB, RT>::set_viewport(size_t in_width,
130
130
size_t in_height)
131
131
{
132
- // TODO Lab: 2.01 Implement `set_render_target`, `set_viewport`, and `clear_render_target` methods of `raytracer` class
132
+ width = in_width;
133
+ height = in_height;
133
134
// TODO Lab: 2.06 Add `history` resource in `raytracer` class
134
135
}
135
136
136
137
template <typename VB, typename RT>
137
138
inline void raytracer<VB, RT>::clear_render_target(
138
139
const RT& in_clear_value)
139
140
{
140
- // TODO Lab: 2.01 Implement `set_render_target`, `set_viewport`, and `clear_render_target` methods of `raytracer` class
141
+ for (size_t i = 0 ; i < render_target->get_number_of_elements (); i++) {
142
+ render_target->item (i) = in_clear_value;
143
+ }
141
144
// TODO Lab: 2.06 Add `history` resource in `raytracer` class
142
145
}
143
146
@@ -165,19 +168,33 @@ namespace cg::renderer
165
168
float3 position, float3 direction,
166
169
float3 right, float3 up, size_t depth, size_t accumulation_num)
167
170
{
168
- // TODO Lab: 2.01 Implement `ray_generation` and `trace_ray` method of `raytracer` class
171
+ #pragma omp parallel for
172
+ for (int x = 0 ; x < width; x++) {
173
+ for (int y = 0 ; y < height; y++) {
174
+ float u = (2 .f * x) / static_cast <float >(width) - 1 .f ;
175
+ float v = (2 .f * y) / static_cast <float >(height) - 1 .f ;
176
+ u *= static_cast <float >(width) / static_cast <float >(height);
177
+ float3 ray_direction = direction + right * u - up * v;
178
+ ray primary_ray (position, ray_direction);
179
+ payload payload = trace_ray (primary_ray, depth);
180
+ render_target->item (x, y) = RT::from_color (payload.color );
181
+ }
182
+ }
169
183
// TODO Lab: 2.06 Implement TAA in `ray_generation` method of `raytracer` class
170
184
}
171
185
172
186
template <typename VB, typename RT>
173
187
inline payload raytracer<VB, RT>::trace_ray(
174
188
const ray& ray, size_t depth, float max_t , float min_t ) const
175
189
{
176
- // TODO Lab: 2.01 Implement `ray_generation` and `trace_ray` method of `raytracer` class
190
+ if (depth == 0 ) {
191
+ return miss_shader (ray);
192
+ }
193
+ depth--;
177
194
// TODO Lab: 2.02 Adjust `trace_ray` method of `raytracer` class to traverse geometry and call a closest hit shader
178
195
// TODO Lab: 2.04 Adjust `trace_ray` method of `raytracer` to use `any_hit_shader`
179
196
// TODO Lab: 2.05 Adjust `trace_ray` method of `raytracer` class to traverse the acceleration structure
180
- return payload{} ;
197
+ return miss_shader (ray) ;
181
198
}
182
199
183
200
template <typename VB, typename RT>
0 commit comments