支持抗锯齿

This commit is contained in:
2025-08-23 12:19:28 +08:00
parent dd72a8e3fd
commit 1f7720d54e
23 changed files with 879 additions and 183 deletions
+8
View File
@@ -102,4 +102,12 @@ enum PixelFormat
PF_UINT8_RGBA,
};
enum AntiAliasingTech
{
AA_None,
AA_MSAA_2X2,
AA_MSAA_4X4,
};
DV_CORE_END_NAMESPACE
+3 -1
View File
@@ -17,9 +17,11 @@ public:
RenderableConstPtr getRenderable(size_t index) const;
void build(const Scene& scene);
void process(UniformBuffer& uniformBuffer, RenderTarget& renderTarget);
void process(AntiAliasingTech aaTech, UniformBuffer& uniformBuffer, RenderTarget& renderTarget);
protected:
AntiAliasingTech m_aaTech;
std::vector<RenderableConstPtr> m_queue;
public:
@@ -23,11 +23,8 @@ public:
public:
void process(const RenderQueue& renderQueue);
const NodeArray& getNodes(void) const {
return m_nodes;
}
protected:
public:
NodeArray m_nodes;
};
@@ -0,0 +1,87 @@
#pragma once
#include "dvc_config.h"
#include "dvc_render_step_PS.h"
DV_CORE_BEGIN_NAMESPACE
class OutputMergerStep
{
public:
void process(const PixelShaderStep::StartOffsetArray& startOffsetArray, const PixelShaderStep::FragementArray& fragementArray,
AntiAliasingTech aaTech, RenderTarget& renderTarget);
private:
void mergeFragement_without_AA(int32_t x, int32_t y,
const std::multimap<float32_t, int32_t>& fragementArrayMap,
const PixelShaderStep::FragementArray& fragementArray, RenderTarget& renderTarget);
template<int32_t kSampleSize, uint32_t kSampleMask>
void mergeFragement_with_AA(int32_t x, int32_t y,
const std::multimap<float32_t, int32_t>& fragementArrayMap,
const PixelShaderStep::FragementArray& fragementArray, RenderTarget& renderTarget);
};
template<int32_t kSampleSize, uint32_t kSampleMask>
void OutputMergerStep::mergeFragement_with_AA(int32_t x, int32_t y, const std::multimap<float32_t, int32_t>& fragementArrayMap,
const PixelShaderStep::FragementArray& fragementArray, RenderTarget& renderTarget)
{
if (fragementArrayMap.empty())
{
return;
}
else if (fragementArrayMap.size() == 1)
{
const PixelShaderStep::Fragement& fragement = fragementArray[fragementArrayMap.begin()->second];
fVector4 finalColor = fragement.color;
finalColor.w = MathUtil::popcount((uint16_t)(fragement.mask & kSampleMask)) / (float32_t)kSampleSize;
renderTarget.setPixel(x, y, finalColor, fragement.depth);
}
else
{
std::array<int32_t, kSampleSize> samples;
samples.fill(-1);
float finalDepth = 0;
std::multimap<float32_t, int32_t>::const_iterator it, end = fragementArrayMap.end();
for (it = fragementArrayMap.begin(); it != end; ++it)
{
const PixelShaderStep::Fragement& fragement = fragementArray[it->second];
for (int32_t k = 0; k < kSampleSize; k++)
{
if ((fragement.mask & (1 << k)) != 0)
{
samples[k] = it->second;
}
}
finalDepth = fragement.depth;
}
fVector3 finalColor(0.f, 0.f, 0.f);
int32_t bitCounts = 0;
for (int32_t k = 0; k < kSampleSize; k++)
{
int32_t fragementID = samples[k];
if (fragementID < 0 || fragementID >= fragementArray.size()) continue;
const PixelShaderStep::Fragement& fragement = fragementArray[fragementID];
finalColor += fragement.color.xyz();
bitCounts++;
}
if (bitCounts == 0)
{
return;
}
if (bitCounts > 1)
{
finalColor /= (float32_t)bitCounts;
}
float32_t finalAlpha = bitCounts / (float32_t)kSampleSize;
renderTarget.setPixel(x, y, fVector4(finalColor, finalAlpha), finalDepth);
}
}
DV_CORE_END_NAMESPACE
+16 -1
View File
@@ -8,8 +8,23 @@ DV_CORE_BEGIN_NAMESPACE
class PixelShaderStep
{
public:
void process(const VertexShaderStep::NodeArray& vsNodeArray, RenderTarget& renderTarget);
struct Fragement
{
float32_t depth;
fVector4 color;
uint32_t mask;
int32_t next;
};
typedef std::vector<int32_t> StartOffsetArray;
typedef std::vector<Fragement> FragementArray;
public:
void process(const VertexShaderStep::NodeArray& vsNodeArray, AntiAliasingTech aaTech, int32_t canvasWidth, int32_t canvasHeight);
public:
StartOffsetArray m_startOffsetArray;
FragementArray m_fragementArray;
};
DV_CORE_END_NAMESPACE
@@ -20,15 +20,10 @@ public:
};
typedef std::vector<Node> NodeArray;
public:
const NodeArray& getNodes() const {
return m_nodes;
}
public:
void process(UniformBuffer& uniformBuffer, const InputAssemberStep::NodeArray& assembedNodeArray);
protected:
public:
NodeArray m_nodes;
};
@@ -10,7 +10,9 @@ class DV_CORE_API Rasterizer
{
//Draw Triangle with Larrabee
public:
typedef std::function<void(const std::pair<int32_t, int32_t>& pos, const fVector3& percent)> DrawTriangleCallback;
typedef std::function<
void(const std::pair<int32_t, int32_t>& pos, const fVector3& percent, uint32_t mask)
> DrawTriangleCallback;
struct DebugParam
{
@@ -27,9 +29,10 @@ public:
};
//Larrabee algorithm
static void drawTriangleLarrabee(int32_t canvasWidth, int32_t canvasHeight,
static void drawTriangleLarrabee(AntiAliasingTech aaTech, int32_t canvasWidth, int32_t canvasHeight,
const fVector2& v0, const fVector2& v1, const fVector2& v2,
DrawTriangleCallback callback, bool ccw=true, const DebugParam* debugParam=nullptr);
DrawTriangleCallback callback, bool ccw=true,
const DebugParam* debugParam=nullptr);
public:
//BoundingBox algorithm