@@ -10,15 +10,71 @@ void cg::renderer::rasterization_renderer::init()
1010 // TODO Lab: 1.03 Adjust `cg::renderer::rasterization_renderer` and `cg::renderer::renderer` classes to consume `cg::world::model`
1111 // TODO Lab: 1.04 Setup an instance of camera `cg::world::camera` class in `cg::renderer::renderer` and `cg::renderer::rasterization_renderer`
1212 // TODO Lab: 1.06 Add depth buffer in `cg::renderer::rasterization_renderer`
13+ rasterizer = std::make_shared<cg::renderer::rasterizer<cg::vertex, cg::unsigned_color>>();
14+ rasterizer->set_viewport (settings->width , settings->height );
15+
16+ // Создать render target и depth buffer и привязать их к растеризатору
17+ render_target = std::make_shared<cg::resource<cg::unsigned_color>>(settings->width , settings->height );
18+ depth_buffer = std::make_shared<cg::resource<float >>(settings->width , settings->height );
19+ rasterizer->set_render_target (render_target, depth_buffer);
20+
21+ // Загрузить модель из настроек (дублирует базовый renderer::load_model, но это локально для этого рендера)
22+ model = std::make_shared<cg::world::model>();
23+ model->load_obj (settings->model_path );
24+
25+ // Настроить камеру из настроек (дублирует renderer::load_camera для автономности)
26+ camera = std::make_shared<cg::world::camera>();
27+ camera->set_height (static_cast <float >(settings->height ));
28+ camera->set_width (static_cast <float >(settings->width ));
29+ float3 pos{0 .f ,1 .f ,5 .f };
30+ if (settings->camera_position .size () >= 3 ) {
31+ pos = float3{settings->camera_position [0 ], settings->camera_position [1 ], settings->camera_position [2 ]};
32+ }
33+ camera->set_position (pos);
34+ camera->set_phi (settings->camera_phi );
35+ camera->set_theta (settings->camera_theta );
36+ camera->set_angle_of_view (settings->camera_angle_of_view );
37+ camera->set_z_near (settings->camera_z_near );
38+ camera->set_z_far (settings->camera_z_far );
1339}
1440void cg::renderer::rasterization_renderer::render ()
1541{
1642 // TODO Lab: 1.02 Implement image clearing & saving in `cg::renderer::rasterization_renderer` class
1743 // TODO Lab: 1.04 Implement `vertex_shader` lambda for the instance of `cg::renderer::rasterizer`
1844 // TODO Lab: 1.05 Implement `pixel_shader` lambda for the instance of `cg::renderer::rasterizer`
1945 // TODO Lab: 1.03 Adjust `cg::renderer::rasterization_renderer` and `cg::renderer::renderer` classes to consume `cg::world::model`
46+ float4x4 matrix = mul (
47+ camera->get_projection_matrix (),
48+ camera->get_view_matrix (),
49+ model->get_world_matrix ()
50+ );
51+
52+ // Привязать лямбды шейдеров
53+ rasterizer->vertex_shader = [matrix](float4 vertex, cg::vertex vertex_data) {
54+ float4 clip = mul (matrix, vertex); // позиция в clip‑пространстве
55+ return std::make_pair (clip, vertex_data); // пробрасываем атрибуты без изменений
56+ };
57+
58+ rasterizer->pixel_shader = [](const cg::vertex& v, const float /* z*/ ) -> cg::color {
59+ // Простой вывод: используем ambient из вершины [0,1]
60+ return cg::color::from_float3 (v.ambient );
61+ };
62+
63+ // Очистка цветового и глубинного буфера
64+ rasterizer->clear_render_target (cg::unsigned_color{111 , 15 , 112 }, DEFAULT_DEPTH);
65+
66+ // Отрисовка по всем shape модели: задаем VB/IB и вызываем draw
67+ for (size_t shape = 0 ; shape < model->get_index_buffers ().size (); ++shape)
68+ {
69+ rasterizer->set_vertex_buffer (model->get_vertex_buffers ()[shape]);
70+ rasterizer->set_index_buffer (model->get_index_buffers ()[shape]);
71+ rasterizer->draw (model->get_index_buffers ()[shape]->count (), 0 );
72+ }
73+
74+ // Сохранить результат в файл из настроек
75+ cg::utils::save_resource (*render_target, settings->result_path );
2076}
2177
2278void cg::renderer::rasterization_renderer::destroy () {}
2379
24- void cg::renderer::rasterization_renderer::update () {}
80+ void cg::renderer::rasterization_renderer::update () {}
0 commit comments