Skip to content

Commit dfecee2

Browse files
authored
Setup rendering with camera and model loading
Implemented rendering setup, including camera and model loading, shader binding, and rendering logic.
1 parent 1a3042b commit dfecee2

1 file changed

Lines changed: 57 additions & 1 deletion

File tree

src/renderer/rasterizer/rasterizer_renderer.cpp

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
}
1440
void 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

2278
void cg::renderer::rasterization_renderer::destroy() {}
2379

24-
void cg::renderer::rasterization_renderer::update() {}
80+
void cg::renderer::rasterization_renderer::update() {}

0 commit comments

Comments
 (0)