-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rasterizer.h
137 lines (111 loc) · 3.48 KB
/
Rasterizer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#pragma once
#include <algorithm>
#include<Eigen/Eigen>
#include"Triangle.h"
#include"Shader.h"
#include<string>
#include "nonstd/optional.hpp"
using namespace Eigen;
namespace Rst{
//KS: 预设颜色
static struct Color{
Eigen::Vector3f green = Eigen::Vector3f(0, 255, 0);
Eigen::Vector3f red = Eigen::Vector3f(0, 0, 255);
Eigen::Vector3f blue = Eigen::Vector3f(255, 0,0 );
Eigen::Vector3f white = Eigen::Vector3f(0, 0, 0);
}Color;
//KS: 绘制三角形的时候两种模型
enum class Primitive
{
Line,
Fill
};
//KS: Shader类型
enum class ShaderType
{
Normal,
Phong,
Bump,
Displacement,
Texture
};
// 定义缓冲区
enum class Buffer
{
Depth = 1,
Color = 2
};
inline Buffer operator|(Buffer a, Buffer b)
{
return Buffer((int)a | (int)b);
}
inline Buffer operator&(Buffer a, Buffer b)
{
return Buffer((int)a & (int)b);
}
//KS: position index color 数组都有唯一的id这样不容易出错, 处理的是有是需要按顺序处理即可
struct PosId
{
int id = 0;
};
struct IndId
{
int id = 0;
};
struct ColId
{
int id = 0;
};
class Rasterizer
{
public:
Rasterizer(int w, int h);
void SetModel(float rotationX, float rotationY, float rotationZ);
void SetView(Eigen::Vector3f eyePos);
void SetView(Eigen::Vector3f eyePos, Eigen::Vector3f at);
void SetProjection(float camFov,float aspectRatio,float zNear,float zFar);
void SetPixel(const Eigen::Vector3f& point, const Eigen::Vector3f& color);
void SetPixel(const Eigen::Vector2i& point, const Eigen::Vector3f& color);
void DrawTriangle(PosId Positionid, IndId indexId,ColId colId, Primitive type);
void DrawModel(std::vector<Triangle *>&TriangleList);
void SetVertexShader(std::function<Eigen::Vector3f(VertexShaderPayload)> VertShader);
void SetFragmentShader(std::function<Eigen::Vector3f(FragmentShaderPayload)> FargShader);
PosId LoadPosition(std::vector<Eigen::Vector3f>& pos);
IndId LoadIndex(std::vector<Eigen::Vector3i>& ind);
ColId LoadColor(std::vector<Eigen::Vector3f>& col);
std::vector<Eigen::Vector3f>& GetFrameBuffer() { return frameBuffer; };
void Clear(Buffer buff);
public:
//KS: 选着渲染模式
void SelectShader(ShaderType type);
private:
void DrawLine(Eigen::Vector4f begin, Eigen::Vector4f end, Eigen::Vector3f color);
void RasterizeTriangleLine(const Triangle& t);
void RasterizeTriangleFill(const Triangle& t);
void RasterizerModel(const Triangle& t, const std::array<Eigen::Vector3f, 3>& view_pos);
bool InsideTriangle(float x, float y, const Eigen::Vector4f* tri);
std::tuple<float, float, float> ComputeBarycentric2D(float x, float y, const Vector4f* tri);
private:
int GetNextId() { return next_id++; }//KS: 为prosition index color 分配id
int GetIndex(int x, int y) { return (height - 1 - y) * width + x; }//KS: 根据像素拿到索引
Eigen::Vector4f ToVec4(const Eigen::Vector3f& v3, float w = 1.0f)
{
return Eigen::Vector4f(v3.x(), v3.y(), v3.z(), w);
}
Eigen::Matrix4f model;
Eigen::Matrix4f view;
Eigen::Matrix4f projection;
std::vector<Eigen::Vector3f> frameBuffer;
std::vector<float>depthBuffer;
std::map<int, std::vector<Eigen::Vector3f>> posMap;
std::map<int, std::vector<Eigen::Vector3i>>indMap;
std::map<int, std::vector<Eigen::Vector3f>>colMap;
int width;
int height;
int next_id = 0;
//KS: 显示obj模型
nonstd::optional<Texture> texture;//KS: nonstd 用于在cpp14实现optional
std::function<Eigen::Vector3f(VertexShaderPayload)> vertShaderFunc;
std::function<Eigen::Vector3f(FragmentShaderPayload)>fragmentShaderFunc;
};
}