/
KernelGenerator.cpp
101 lines (75 loc) · 3.01 KB
/
KernelGenerator.cpp
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
#include "KernelGenerator.h"
#include "Utilities.h"
#include <d3d11.h>
#include "GraphicsEngine.h"
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
using namespace DirectX;
std::uniform_real_distribution<float> randomFloats(0.0f, 1.0f);
KernelGenerator::KernelGenerator()
{
}
KernelGenerator::~KernelGenerator()
{
}
void KernelGenerator::generateSSAOKernel()
{
DirectX::XMFLOAT3 tmpSample;
generator.seed(std::random_device()());
std::vector<DirectX::PackedVector::XMCOLOR> randomVectors(256 * 256);
for (int i = 0; i < SSAO_KERNEL_SIZE; i++)
{
tmpSample.x = randomFloats(generator) * 2.0f - 1.0f;
tmpSample.y = randomFloats(generator) * 2.0f - 1.0f;
tmpSample.z = randomFloats(generator);
DirectX::XMVECTOR tmpVector;
tmpVector.m128_f32[0] = tmpSample.x;
tmpVector.m128_f32[1] = tmpSample.y;
tmpVector.m128_f32[2] = tmpSample.z;
tmpVector = DirectX::XMVector3Normalize(tmpVector);
tmpSample.x = tmpVector.m128_f32[0];
tmpSample.y = tmpVector.m128_f32[1];
tmpSample.z = tmpVector.m128_f32[2];
float scale = float(i) / 64.0f;
scale = lerp(0.1f, 1.0f, scale * scale);
tmpSample.x *= scale;
tmpSample.y *= scale;
tmpSample.z *= scale;
m_ssao_kernel[i] = tmpSample;
}
}
void KernelGenerator::generateOffsetVectors()
{
m_ssao_offset[0] = DirectX::XMFLOAT4(+1.0f, +1.0f, +1.0f, 0.0f);
m_ssao_offset[1] = DirectX::XMFLOAT4(-1.0f, -1.0f, -1.0f, 0.0f);
m_ssao_offset[2] = DirectX::XMFLOAT4(-1.0f, +1.0f, +1.0f, 0.0f);
m_ssao_offset[3] = DirectX::XMFLOAT4(+1.0f, -1.0f, -1.0f, 0.0f);
m_ssao_offset[4] = DirectX::XMFLOAT4(+1.0f, +1.0f, -1.0f, 0.0f);
m_ssao_offset[5] = DirectX::XMFLOAT4(-1.0f, -1.0f, +1.0f, 0.0f);
m_ssao_offset[6] = DirectX::XMFLOAT4(-1.0f, +1.0f, -1.0f, 0.0f);
m_ssao_offset[7] = DirectX::XMFLOAT4(+1.0f, -1.0f, +1.0f, 0.0f);
// 6 face center point vectors
m_ssao_offset[8] = DirectX::XMFLOAT4(-1.0f, 0.0f, 0.0f, 0.0f);
m_ssao_offset[9] = DirectX::XMFLOAT4(+1.0f, 0.0f, 0.0f, 0.0f);
m_ssao_offset[10] = DirectX::XMFLOAT4(0.0f, -1.0f, 0.0f, 0.0f);
m_ssao_offset[11] = DirectX::XMFLOAT4(0.0f, +1.0f, 0.0f, 0.0f);
m_ssao_offset[12] = DirectX::XMFLOAT4(0.0f, 0.0f, -1.0f, 0.0f);
m_ssao_offset[13] = DirectX::XMFLOAT4(0.0f, 0.0f, +1.0f, 0.0f);
std::default_random_engine generator;
generator.seed(std::random_device()());
std::uniform_real_distribution<float> randomFloatsOffset(0.25f, 1.0f);
for (int i = 0; i < 14; ++i)
{
float s = randomFloatsOffset(generator);
DirectX::XMVECTOR v = s * DirectX::XMVector4Normalize(DirectX::XMLoadFloat4(&m_ssao_offset[i]));
DirectX::XMStoreFloat4(&m_ssao_offset[i], v);
}
}
DirectX::XMFLOAT3* KernelGenerator::getSSAOKernel()
{
return m_ssao_kernel;
}
DirectX::XMFLOAT4* KernelGenerator::getSSAOOffset()
{
return m_ssao_offset;
}