引入 Gfx::DrawContext 统一绘制入口,封装FrameBuffer/DepthBuffer/Rasterizer/角形光栅化;main.cpp 改用 DrawContext;同步更新文档路径
This commit is contained in:
+9
-22
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user