Skip to content

Commit

Permalink
update multi-thread to rasterization and fragment shader
Browse files Browse the repository at this point in the history
Signed-off-by: ZhuohaoHe <[email protected]>
  • Loading branch information
ZzzhHe committed Sep 17, 2024
1 parent c1a8bb0 commit 081444c
Showing 1 changed file with 38 additions and 17 deletions.
55 changes: 38 additions & 17 deletions src/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,34 +84,55 @@ void SimpleRenderer::DrawModel(const Model &model, uint32_t *buffer) {
/* * * * * * * */

/* * * Rasterization * * */
std::vector<std::vector<Fragment>> fragmentsBuffer(width_ * height_);
std::vector<std::vector<std::vector<Fragment>>> fragmentsBuffer_all_thread(
kNProc, std::vector<std::vector<Fragment>>(width_ * height_));

#pragma omp parallel num_threads(kNProc) default(none) \
shared(processedVertex, fragmentsBuffer_all_thread, rasterizer_, width_, \
height_) firstprivate(model)
{
int thread_id = omp_get_thread_num();
auto &fragmentsBuffer_per_thread = fragmentsBuffer_all_thread[thread_id];

#pragma omp for
for (const auto &f : model.GetFaces()) {
auto v0 = processedVertex[f.GetIndex(0)];
auto v1 = processedVertex[f.GetIndex(1)];
auto v2 = processedVertex[f.GetIndex(2)];

for (const auto &f : model.GetFaces()) {
auto v0 = processedVertex[f.GetIndex(0)];
auto v1 = processedVertex[f.GetIndex(1)];
auto v2 = processedVertex[f.GetIndex(2)];
const Material *material = &f.GetMaterial();

const Material *material = &f.GetMaterial();
auto fragments = rasterizer_->Rasterize(v0, v1, v2);

auto fragments = rasterizer_->Rasterize(v0, v1, v2);
for (auto &fragment : fragments) {
fragment.material = material;

for (auto &fragment : fragments) {
fragment.material = material;
size_t x = fragment.screen_coord[0];
size_t y = fragment.screen_coord[1];

size_t x = fragment.screen_coord[0];
size_t y = fragment.screen_coord[1];
if (x >= width_ || y >= height_) {
continue;
}

if (x >= width_ || y >= height_) {
continue;
size_t index = x + y * width_;
fragmentsBuffer_per_thread[index].push_back(fragment);
}
}
}

size_t index = x + y * width_;
fragmentsBuffer[index].push_back(fragment);
// Merge fragments
std::vector<std::vector<Fragment>> fragmentsBuffer(width_ * height_);
for (const auto &fragmentsBuffer_per_thread : fragmentsBuffer_all_thread) {
for (size_t i = 0; i < fragmentsBuffer_per_thread.size(); i++) {
fragmentsBuffer[i].insert(fragmentsBuffer[i].end(),
fragmentsBuffer_per_thread[i].begin(),
fragmentsBuffer_per_thread[i].end());
}
}
/* * * * * * * */
/* * * * * * * */

/* * * Fragment Shader * * */
/* * * Fragment Shader * * */
#pragma omp parallel for
for (size_t i = 0; i < fragmentsBuffer.size(); i++) {
const auto &fragments = fragmentsBuffer[i];
if (fragments.empty()) {
Expand Down

0 comments on commit 081444c

Please sign in to comment.