支持抗锯齿
This commit is contained in:
@@ -102,4 +102,12 @@ enum PixelFormat
|
||||
PF_UINT8_RGBA,
|
||||
};
|
||||
|
||||
enum AntiAliasingTech
|
||||
{
|
||||
AA_None,
|
||||
|
||||
AA_MSAA_2X2,
|
||||
AA_MSAA_4X4,
|
||||
};
|
||||
|
||||
DV_CORE_END_NAMESPACE
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user