引入 Gfx::DrawContext 统一绘制入口,封装FrameBuffer/DepthBuffer/Rasterizer/角形光栅化;main.cpp 改用 DrawContext;同步更新文档路径

This commit is contained in:
SepComet
2026-06-06 17:55:50 +08:00
parent a051f6da4c
commit 3e735e27b0
7 changed files with 174 additions and 59 deletions
+9 -22
View File
@@ -7,14 +7,11 @@
#include "Matrix4x4.h"
#include "MathUtil.h"
#include "Color.h"
#include "FrameBuffer.h"
#include "Rasterizer.h"
#include "TriangleRasterizer.h"
#include "Triangle.h"
#include "Camera.h"
#include <cstdlib>
#include "Vertex.h"
#include "DepthBuffer.h"
#include "DrawContext.h"
#include "Display.h"
#ifdef USE_FRAMEBUFFER
@@ -117,10 +114,7 @@ int main(int argc, char *argv[])
return -1;
}
Core::FrameBuffer *frameBuffer = new Core::FrameBuffer(width, height);
Core::DepthBuffer *depthBuffer = new Core::DepthBuffer(width, height);
Rasterizer::Rasterizer rasterizer(frameBuffer, depthBuffer);
Rasterizer::TriangleRasterizer triangleRasterizer(frameBuffer, depthBuffer);
Gfx::DrawContext ctx(width, height);
Scene::Camera camera;
camera.transform.position = Math::Vector3(0.0f, 0.0f, 3.0f);
@@ -155,13 +149,12 @@ int main(int argc, char *argv[])
const RenderData::Color cubeColor(240, 240, 240, 255);
const float aspectRatio = static_cast<float>(width) / static_cast<float>(height);
bool isRuning = true;
while (isRuning)
bool isRunning = true;
while (isRunning)
{
display->poll_events(isRuning);
display->poll_events(isRunning);
frameBuffer->clear(clearColor);
depthBuffer->clear();
ctx.clear(clearColor);
const float timeSeconds = static_cast<float>(display->get_time_ms()) * 0.001f;
const Math::Matrix4x4 model =
@@ -204,10 +197,6 @@ int main(int argc, char *argv[])
continue;
}
const Math::Vector3 &viewV0 = viewSpaceVertices[cubeTriangle.vertices[0]];
const Math::Vector3 &viewV1 = viewSpaceVertices[cubeTriangle.vertices[1]];
const Math::Vector3 &viewV2 = viewSpaceVertices[cubeTriangle.vertices[2]];
drawTriangles[drawCommandCount++] =
RenderData::Triangle(
Scene::Vertex(v0.screen),
@@ -217,7 +206,7 @@ int main(int argc, char *argv[])
for (size_t i = 0; i < drawCommandCount; ++i)
{
triangleRasterizer.DrawTriangle2D(drawTriangles[i], cubeColor);
ctx.draw_triangle(drawTriangles[i], cubeColor);
}
for (size_t faceIndex = 0; faceIndex < cubeFaces.size(); ++faceIndex)
@@ -239,19 +228,17 @@ int main(int argc, char *argv[])
continue;
}
rasterizer.DrawLine(
ctx.draw_line(
Math::Vector2(start.screen.x, start.screen.y).to_vector2Int(),
Math::Vector2(end.screen.x, end.screen.y).to_vector2Int(),
clearColor);
}
}
display->present(frameBuffer);
ctx.present(display);
}
display->shutdown();
delete display;
delete frameBuffer;
delete depthBuffer;
return 0;
}
+61
View File
@@ -0,0 +1,61 @@
#include "DrawContext.h"
#include "FrameBuffer.h"
#include "DepthBuffer.h"
#include "Rasterizer.h"
#include "TriangleRasterizer.h"
#include "Display.h"
namespace Gfx
{
DrawContext::DrawContext(int32_t width, int32_t height)
{
frameBuffer = new Core::FrameBuffer(width, height);
depthBuffer = new Core::DepthBuffer(width, height);
rasterizer = new Rasterizer::Rasterizer(frameBuffer, depthBuffer);
triangleRasterizer = new Rasterizer::TriangleRasterizer(frameBuffer, depthBuffer);
}
DrawContext::~DrawContext()
{
delete triangleRasterizer;
delete rasterizer;
delete depthBuffer;
delete frameBuffer;
}
int32_t DrawContext::get_width() const
{
return frameBuffer->get_width();
}
int32_t DrawContext::get_height() const
{
return frameBuffer->get_height();
}
void DrawContext::clear(const RenderData::Color& color)
{
frameBuffer->clear(color);
depthBuffer->clear();
}
void DrawContext::clear_depth()
{
depthBuffer->clear();
}
void DrawContext::draw_line(const Math::Vector2Int& from, const Math::Vector2Int& to, const RenderData::Color& color)
{
rasterizer->DrawLine(from, to, color);
}
void DrawContext::draw_triangle(const RenderData::Triangle& triangle, const RenderData::Color& color)
{
triangleRasterizer->DrawTriangle2D(triangle, color);
}
void DrawContext::present(Platform::IDisplay* display)
{
display->present(frameBuffer);
}
}
+52
View File
@@ -0,0 +1,52 @@
#pragma once
#include "Color.h"
#include "Vector2.h"
#include "Triangle.h"
#include <cstdint>
namespace Core
{
class FrameBuffer;
class DepthBuffer;
}
namespace Rasterizer
{
class Rasterizer;
class TriangleRasterizer;
}
namespace Platform
{
class IDisplay;
}
namespace Gfx
{
class DrawContext
{
private:
Core::FrameBuffer* frameBuffer;
Core::DepthBuffer* depthBuffer;
Rasterizer::Rasterizer* rasterizer;
Rasterizer::TriangleRasterizer* triangleRasterizer;
public:
DrawContext(int32_t width, int32_t height);
~DrawContext();
DrawContext(const DrawContext&) = delete;
DrawContext& operator=(const DrawContext&) = delete;
int32_t get_width() const;
int32_t get_height() const;
void clear(const RenderData::Color& color);
void clear_depth();
void draw_line(const Math::Vector2Int& from, const Math::Vector2Int& to, const RenderData::Color& color);
void draw_triangle(const RenderData::Triangle& triangle, const RenderData::Color& color);
void present(Platform::IDisplay* display);
};
}