Set SMAA antialiasing
This commit is contained in:
1 parent
f2e238ed5e
commit
bf04c70f50
10 files changed
+1015
-36
No files matched your search
+179
-35
@@ -12,6 +12,16 @@
|
||||
TMyApplication* Application;
|
||||
|
||||
|
||||
#define AREATEX_WIDTH 160
|
||||
#define AREATEX_HEIGHT 560
|
||||
#define SEARCHTEX_WIDTH 66
|
||||
#define SEARCHTEX_HEIGHT 33
|
||||
|
||||
|
||||
GLuint area_tex;
|
||||
GLuint search_tex;
|
||||
|
||||
|
||||
void TMyApplication::InnerInit()
|
||||
{
|
||||
|
||||
@@ -38,13 +48,20 @@ void TMyApplication::InnerInit()
|
||||
ResourceManager->ShaderManager.AddShader("DefaultShader", "shader1vertex.txt", "shader1fragment.txt");
|
||||
ResourceManager->ShaderManager.AddShader("FrameShader", "frameshader_vertex.txt", "frameshader_fragment.txt");
|
||||
ResourceManager->ShaderManager.AddShader("ColorShader", "color_vertex.txt", "color_fragment.txt");
|
||||
ResourceManager->ShaderManager.AddShader("SSAA_4X", "SSAA_4X.vertex", "SSAA_4X.frag");
|
||||
|
||||
|
||||
ResourceManager->ShaderManager.AddShader("SmaaEdge", "smaa/edge_vertex.txt", "smaa/edge_fragment.txt");
|
||||
ResourceManager->ShaderManager.AddShader("SmaaBlend", "smaa/blend_vertex.txt", "smaa/blend_fragment.txt");
|
||||
ResourceManager->ShaderManager.AddShader("SmaaNeighborhood", "smaa/neighborhood_vertex.txt", "smaa/neighborhood_fragment.txt");
|
||||
|
||||
Renderer->PushShader("DefaultShader");
|
||||
|
||||
ResourceManager->TexList.AddTexture("console_bkg.bmp");
|
||||
|
||||
ResourceManager->FrameManager.AddFrameRenderBuffer("LevelBuffer", 512, 512);
|
||||
|
||||
ResourceManager->FrameManager.AddFrameRenderBuffer("AlbedoBuffer", 512, 512);
|
||||
ResourceManager->FrameManager.AddFrameRenderBuffer("EdgeBuffer", 512, 512);
|
||||
ResourceManager->FrameManager.AddFrameRenderBuffer("BlendBuffer", 512, 512);
|
||||
|
||||
pair.second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 0, 0));
|
||||
pair.second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(0, 512, 0));
|
||||
pair.second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 512, 0));
|
||||
@@ -53,13 +70,24 @@ void TMyApplication::InnerInit()
|
||||
pair.second.Data.Vec3CoordArr[CONST_STRING_POSITION_ATTRIB].push_back(Vector3f(512, 0, 0));
|
||||
|
||||
|
||||
//Choose colored or black and white -- Vladislav Khorev vladislav.khorev@fishrungames.com
|
||||
#if 1
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(1, 0, 0, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(1, 0, 0, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 1, 0, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 0, 1, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 0, 1, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 1, 0, 1));
|
||||
#else
|
||||
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(1, 1, 1, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(1, 1, 1, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(1, 1, 1, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 0, 0, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 0, 0, 1));
|
||||
pair.second.Data.Vec4CoordArr[CONST_STRING_COLOR_ATTRIB].push_back(Vector4f(0, 0, 0, 1));
|
||||
|
||||
#endif
|
||||
pair.first.ShaderName = "ColorShader";
|
||||
|
||||
pair.second.RefreshBuffer();
|
||||
@@ -87,11 +115,64 @@ void TMyApplication::InnerInit()
|
||||
Renderer->SetOrthoProjection();
|
||||
|
||||
Renderer->SetFullScreenViewport();
|
||||
|
||||
glDisable(GL_BLEND); //Don't forget to disable blending or whole thing will not work!!! -- Vladislav Khorev vladislav.khorev@fishrungames.com
|
||||
|
||||
Inited = true;
|
||||
|
||||
|
||||
|
||||
|
||||
//This is stuff from original https://github.com/scrawl/smaa-opengl
|
||||
//We must have these textures to be used for pattern matching or something -- Vladislav Khorev vladislav.khorev@fishrungames.com
|
||||
|
||||
unsigned char* buffer = 0;
|
||||
FILE* f = 0;
|
||||
|
||||
buffer = new unsigned char[1024 * 1024];
|
||||
f = fopen((ST::PathToResources + "smaa/smaa_area.raw").c_str(), "rb"); //rb stands for "read binary file"
|
||||
|
||||
if (!f)
|
||||
{
|
||||
std::cerr << "Couldn't open smaa_area.raw.\n";
|
||||
}
|
||||
|
||||
fread(buffer, AREATEX_WIDTH * AREATEX_HEIGHT * 2, 1, f);
|
||||
fclose(f);
|
||||
|
||||
f = 0;
|
||||
|
||||
glGenTextures(1, &area_tex);
|
||||
glBindTexture(GL_TEXTURE_2D, area_tex);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, (GLsizei)AREATEX_WIDTH, (GLsizei)AREATEX_HEIGHT, 0, GL_RG, GL_UNSIGNED_BYTE, buffer);
|
||||
|
||||
f = fopen((ST::PathToResources + "smaa/smaa_search.raw").c_str(), "rb");
|
||||
|
||||
if (!f)
|
||||
{
|
||||
std::cerr << "Couldn't open smaa_search.raw.\n";
|
||||
}
|
||||
|
||||
fread(buffer, SEARCHTEX_WIDTH * SEARCHTEX_HEIGHT, 1, f);
|
||||
fclose(f);
|
||||
|
||||
f = 0;
|
||||
|
||||
glGenTextures(1, &search_tex);
|
||||
glBindTexture(GL_TEXTURE_2D, search_tex);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, (GLsizei)SEARCHTEX_WIDTH, (GLsizei)SEARCHTEX_HEIGHT, 0, GL_RED, GL_UNSIGNED_BYTE, buffer);
|
||||
|
||||
delete[] buffer;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void TMyApplication::InnerDeinit()
|
||||
@@ -103,6 +184,9 @@ void TMyApplication::InnerDeinit()
|
||||
*Console<<"APP DEINIT\n";
|
||||
}
|
||||
|
||||
glDeleteTextures(1, &search_tex);
|
||||
glDeleteTextures(1, &area_tex);
|
||||
|
||||
}
|
||||
|
||||
void TMyApplication::InnerOnTapDown(Vector2f p)
|
||||
@@ -133,14 +217,17 @@ void TMyApplication::OnFling(Vector2f v)
|
||||
void TMyApplication::InnerDraw()
|
||||
{
|
||||
|
||||
Renderer->SwitchToFrameBuffer("LevelBuffer");
|
||||
//Render the frame
|
||||
Renderer->SwitchToFrameBuffer("AlbedoBuffer");
|
||||
Renderer->SetProjectionMatrix(512.f, 512.f);
|
||||
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
|
||||
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||
CheckGlError("");
|
||||
|
||||
|
||||
{
|
||||
//Render here all objects that you want to have -- Vladislav Khorev vladislav.khorev@fishrungames.com
|
||||
TRenderParamsSetter params(pair.first);
|
||||
Renderer->DrawTriangleList(pair.second);
|
||||
}
|
||||
@@ -148,47 +235,104 @@ void TMyApplication::InnerDraw()
|
||||
CheckGlError("");
|
||||
|
||||
|
||||
Renderer->SwitchToScreen();
|
||||
Renderer->SetFullScreenViewport();
|
||||
//-------------------------
|
||||
//First pass - edge detection
|
||||
|
||||
Renderer->PushShader("SmaaEdge");
|
||||
|
||||
|
||||
const float cos30 = sqrt(3) / 2;
|
||||
const float sin30 = 0.5f;
|
||||
const float sampleRadiusX = 0.75 / 512;
|
||||
const float sampleRadiusY = 0.75 / 512;
|
||||
Renderer->SwitchToFrameBuffer("EdgeBuffer");
|
||||
Renderer->SetProjectionMatrix(512.f, 512.f);
|
||||
|
||||
Matrix2f rotate30Matrix;
|
||||
rotate30Matrix(0, 0) = cos30;
|
||||
rotate30Matrix(0, 1) = sin30;
|
||||
rotate30Matrix(1, 0) = -sin30;
|
||||
rotate30Matrix(1, 1) = cos30;
|
||||
RenderUniform1i("albedo_tex", 0);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("AlbedoBuffer"));
|
||||
|
||||
|
||||
Renderer->PushShader("SSAA_4X");
|
||||
|
||||
|
||||
std::array<Vector2f, 4> sampleVector = {
|
||||
Vector2f(sampleRadiusX, sampleRadiusY),
|
||||
Vector2f(-sampleRadiusX, sampleRadiusY),
|
||||
Vector2f(-sampleRadiusX, -sampleRadiusY),
|
||||
Vector2f(sampleRadiusX, -sampleRadiusY)
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < 4; i++)
|
||||
{
|
||||
sampleVector[i] = rotate30Matrix * sampleVector[i];
|
||||
|
||||
RenderUniform2fv("samplesOffset[" + boost::lexical_cast<std::string>(i) + "]", &sampleVector[i][0]);
|
||||
}
|
||||
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("LevelBuffer"));
|
||||
Renderer->DrawTriangleList(rect.second);
|
||||
|
||||
Renderer->PopShader();
|
||||
|
||||
CheckGlError("");
|
||||
|
||||
|
||||
//-------------------------
|
||||
//Second pass - blend plus pattern matching
|
||||
|
||||
Renderer->PushShader("SmaaBlend");
|
||||
|
||||
Renderer->SwitchToFrameBuffer("BlendBuffer");
|
||||
Renderer->SetProjectionMatrix(512.f, 512.f);
|
||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||
|
||||
RenderUniform1i("edge_tex", 0);
|
||||
RenderUniform1i("area_tex", 1);
|
||||
RenderUniform1i("search_tex", 2);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("EdgeBuffer"));
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, area_tex);
|
||||
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glBindTexture(GL_TEXTURE_2D, search_tex);
|
||||
|
||||
Renderer->DrawTriangleList(rect.second);
|
||||
|
||||
Renderer->PopShader();
|
||||
|
||||
CheckGlError("");
|
||||
|
||||
#if 1
|
||||
//-------------------------
|
||||
//Last pass - neightborhood
|
||||
|
||||
Renderer->PushShader("SmaaNeighborhood");
|
||||
|
||||
Renderer->SwitchToScreen();
|
||||
Renderer->SetFullScreenViewport();
|
||||
Renderer->SetProjectionMatrix(512.f, 512.f);
|
||||
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
|
||||
|
||||
RenderUniform1i("albedo_tex", 0);
|
||||
RenderUniform1i("blend_tex", 1);
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("BlendBuffer"));
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("AlbedoBuffer"));
|
||||
Renderer->DrawTriangleList(rect.second);
|
||||
|
||||
Renderer->PopShader();
|
||||
|
||||
CheckGlError("");
|
||||
#else
|
||||
|
||||
|
||||
//... or just render intermediate buffers to see what is going on
|
||||
Renderer->PushShader("DefaultShader");
|
||||
Renderer->SwitchToScreen();
|
||||
Renderer->SetFullScreenViewport();
|
||||
Renderer->SetProjectionMatrix(512.f, 512.f);
|
||||
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
//Choose any to render for debug:
|
||||
//glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("AlbedoBuffer"));
|
||||
//glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("EdgeBuffer"));
|
||||
glBindTexture(GL_TEXTURE_2D, ResourceManager->FrameManager.GetFrameTexture("BlendBuffer"));
|
||||
|
||||
Renderer->DrawTriangleList(rect.second);
|
||||
|
||||
Renderer->PopShader();
|
||||
|
||||
CheckGlError("");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user