Add smaa (subsample morphological antialiasing)
This commit is contained in:
parent
afacee5d96
commit
2a8dd508c4
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,132 @@
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013 Jorge Jimenez (jorge@iryoku.com)
|
||||||
|
* Copyright (C) 2013 Jose I. Echevarria (joseignacioechevarria@gmail.com)
|
||||||
|
* Copyright (C) 2013 Belen Masia (bmasia@unizar.es)
|
||||||
|
* Copyright (C) 2013 Fernando Navarro (fernandn@microsoft.com)
|
||||||
|
* Copyright (C) 2013 Diego Gutierrez (diegog@unizar.es)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to
|
||||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is furnished to
|
||||||
|
* do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software. As clarification, there
|
||||||
|
* is no requirement that the copyright notice and permission be included in
|
||||||
|
* binary distributions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SEARCHTEX_H
|
||||||
|
#define SEARCHTEX_H
|
||||||
|
|
||||||
|
#define SEARCHTEX_WIDTH 64
|
||||||
|
#define SEARCHTEX_HEIGHT 16
|
||||||
|
#define SEARCHTEX_PITCH SEARCHTEX_WIDTH
|
||||||
|
#define SEARCHTEX_SIZE (SEARCHTEX_HEIGHT * SEARCHTEX_PITCH)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stored in R8 format. Load it in the following format:
|
||||||
|
* - DX9: D3DFMT_L8
|
||||||
|
* - DX10: DXGI_FORMAT_R8_UNORM
|
||||||
|
*/
|
||||||
|
static const unsigned char searchTexBytes[] = {
|
||||||
|
0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0xfe, 0x7f, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe,
|
||||||
|
0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0xfe, 0x7f, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0xfe,
|
||||||
|
0xfe, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f,
|
||||||
|
0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f,
|
||||||
|
0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f,
|
||||||
|
0x7f, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x00, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -5,6 +5,8 @@
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
#include "gl_builtin_shaders.h"
|
#include "gl_builtin_shaders.h"
|
||||||
|
#include "SmaaAreaTex.h"
|
||||||
|
#include "SmaaSearchTex.h"
|
||||||
|
|
||||||
namespace KIGFX {
|
namespace KIGFX {
|
||||||
|
|
||||||
|
@ -13,7 +15,7 @@ namespace KIGFX {
|
||||||
// =========================
|
// =========================
|
||||||
|
|
||||||
ANTIALIASING_NONE::ANTIALIASING_NONE( OPENGL_COMPOSITOR* aCompositor )
|
ANTIALIASING_NONE::ANTIALIASING_NONE( OPENGL_COMPOSITOR* aCompositor )
|
||||||
: compositor(aCompositor)
|
: compositor( aCompositor )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,32 +59,32 @@ namespace KIGFX {
|
||||||
|
|
||||||
void draw_fullscreen_primitive()
|
void draw_fullscreen_primitive()
|
||||||
{
|
{
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode( GL_MODELVIEW );
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode( GL_PROJECTION );
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
glBegin( GL_TRIANGLES );
|
||||||
glTexCoord2f(0.0f, 1.0f);
|
glTexCoord2f( 0.0f, 1.0f );
|
||||||
glVertex2f(-1.0f, 1.0f);
|
glVertex2f( -1.0f, 1.0f );
|
||||||
glTexCoord2f(0.0f, 0.0f);
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
glVertex2f(-1.0f, -1.0f);
|
glVertex2f( -1.0f, -1.0f );
|
||||||
glTexCoord2f(1.0f, 1.0f);
|
glTexCoord2f( 1.0f, 1.0f );
|
||||||
glVertex2f(1.0f, 1.0f);
|
glVertex2f( 1.0f, 1.0f );
|
||||||
|
|
||||||
glTexCoord2f(1.0f, 1.0f);
|
glTexCoord2f( 1.0f, 1.0f );
|
||||||
glVertex2f(1.0f, 1.0f);
|
glVertex2f( 1.0f, 1.0f );
|
||||||
glTexCoord2f(0.0f, 0.0f);
|
glTexCoord2f( 0.0f, 0.0f );
|
||||||
glVertex2f(-1.0f, -1.0f);
|
glVertex2f( -1.0f, -1.0f );
|
||||||
glTexCoord2f(1.0f, 0.0f);
|
glTexCoord2f( 1.0f, 0.0f );
|
||||||
glVertex2f(1.0f, -1.0f);
|
glVertex2f( 1.0f, -1.0f );
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode( GL_MODELVIEW );
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,28 +104,28 @@ namespace KIGFX {
|
||||||
|
|
||||||
bool ANTIALIASING_SUPERSAMPLING::Init()
|
bool ANTIALIASING_SUPERSAMPLING::Init()
|
||||||
{
|
{
|
||||||
if( mode == SUPERSAMPLING_MODE::X4 && !areShadersCreated ) {
|
if(mode == SUPERSAMPLING_MODE::X4 && !areShadersCreated) {
|
||||||
x4_shader.reset(new SHADER());
|
x4_shader.reset( new SHADER() );
|
||||||
x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX, BUILTIN_SHADERS::ssaa_x4_vertex_shader );
|
x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX, BUILTIN_SHADERS::ssaa_x4_vertex_shader );
|
||||||
x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT, BUILTIN_SHADERS::ssaa_x4_fragment_shader );
|
x4_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT, BUILTIN_SHADERS::ssaa_x4_fragment_shader );
|
||||||
x4_shader->Link();
|
x4_shader->Link();
|
||||||
checkGlError( "linking supersampling x4 shader" );
|
checkGlError( "linking supersampling x4 shader" );
|
||||||
|
|
||||||
GLint source_parameter = x4_shader->AddParameter( "source" ); checkGlError("getting pass 1 colorTex");
|
GLint source_parameter = x4_shader->AddParameter( "source" ); checkGlError( "getting pass 1 colorTex" );
|
||||||
|
|
||||||
x4_shader->Use(); checkGlError("using pass 1 shader");
|
x4_shader->Use(); checkGlError( "using pass 1 shader" );
|
||||||
x4_shader->SetParameter( source_parameter, 0 ); checkGlError("setting colorTex uniform");
|
x4_shader->SetParameter( source_parameter, 0 ); checkGlError( "setting colorTex uniform" );
|
||||||
x4_shader->Deactivate(); checkGlError("deactivating pass 2 shader");
|
x4_shader->Deactivate(); checkGlError( "deactivating pass 2 shader" );
|
||||||
|
|
||||||
areShadersCreated = true;
|
areShadersCreated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( areShadersCreated && mode != SUPERSAMPLING_MODE::X4 ) {
|
if(areShadersCreated && mode != SUPERSAMPLING_MODE::X4) {
|
||||||
x4_shader.reset();
|
x4_shader.reset();
|
||||||
areShadersCreated = false;
|
areShadersCreated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !areBuffersCreated ) {
|
if(!areBuffersCreated) {
|
||||||
ssaaMainBuffer = compositor->CreateBuffer();
|
ssaaMainBuffer = compositor->CreateBuffer();
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||||
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||||
|
@ -159,16 +161,16 @@ namespace KIGFX {
|
||||||
glBindTexture( GL_TEXTURE_2D, compositor->GetBufferTexture( ssaaMainBuffer ) );
|
glBindTexture( GL_TEXTURE_2D, compositor->GetBufferTexture( ssaaMainBuffer ) );
|
||||||
compositor->SetBuffer( OPENGL_COMPOSITOR::DIRECT_RENDERING );
|
compositor->SetBuffer( OPENGL_COMPOSITOR::DIRECT_RENDERING );
|
||||||
|
|
||||||
if( mode == SUPERSAMPLING_MODE::X4 ) {
|
if(mode == SUPERSAMPLING_MODE::X4) {
|
||||||
x4_shader->Use();
|
x4_shader->Use();
|
||||||
checkGlError ( "activating supersampling x4 shader" );
|
checkGlError( "activating supersampling x4 shader" );
|
||||||
}
|
}
|
||||||
|
|
||||||
draw_fullscreen_primitive();
|
draw_fullscreen_primitive();
|
||||||
|
|
||||||
if( mode == SUPERSAMPLING_MODE::X4 ) {
|
if(mode == SUPERSAMPLING_MODE::X4) {
|
||||||
x4_shader->Deactivate();
|
x4_shader->Deactivate();
|
||||||
checkGlError ( "deactivating supersampling x4 shader" );
|
checkGlError( "deactivating supersampling x4 shader" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,4 +184,279 @@ namespace KIGFX {
|
||||||
return compositor->CreateBuffer( GetInternalBufferSize() );
|
return compositor->CreateBuffer( GetInternalBufferSize() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===============================
|
||||||
|
// ANTIALIASING_SMAA
|
||||||
|
// ===============================
|
||||||
|
|
||||||
|
ANTIALIASING_SMAA::ANTIALIASING_SMAA( OPENGL_COMPOSITOR* aCompositor )
|
||||||
|
: compositor( aCompositor ), shadersLoaded( false ), areBuffersInitialized( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
VECTOR2U ANTIALIASING_SMAA::GetInternalBufferSize()
|
||||||
|
{
|
||||||
|
return compositor->GetScreenSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::loadShaders()
|
||||||
|
{
|
||||||
|
// Load constant textures
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
|
||||||
|
glGenTextures( 1, &smaaAreaTex );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, smaaAreaTex );
|
||||||
|
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, AREATEX_WIDTH, AREATEX_HEIGHT, 0, GL_RG, GL_UNSIGNED_BYTE, areaTexBytes );
|
||||||
|
checkGlError( "loading smaa area tex" );
|
||||||
|
|
||||||
|
glGenTextures( 1, &smaaSearchTex );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, smaaSearchTex );
|
||||||
|
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_R8, SEARCHTEX_WIDTH, SEARCHTEX_HEIGHT, 0, GL_RED, GL_UNSIGNED_BYTE, searchTexBytes );
|
||||||
|
checkGlError( "loading smaa search tex" );
|
||||||
|
|
||||||
|
// set up shaders
|
||||||
|
std::string vert_preamble( R"SHADER(
|
||||||
|
#version 120
|
||||||
|
#define SMAA_GLSL_2_1
|
||||||
|
#define SMAA_INCLUDE_VS 1
|
||||||
|
#define SMAA_INCLUDE_PS 0
|
||||||
|
#define SMAA_PRESET_ULTRA
|
||||||
|
uniform vec4 SMAA_RT_METRICS;
|
||||||
|
)SHADER" );
|
||||||
|
|
||||||
|
std::string frag_preamble( R"SHADER(
|
||||||
|
#version 120
|
||||||
|
#define SMAA_GLSL_2_1
|
||||||
|
#define SMAA_INCLUDE_VS 0
|
||||||
|
#define SMAA_INCLUDE_PS 1
|
||||||
|
#define SMAA_PRESET_ULTRA
|
||||||
|
uniform vec4 SMAA_RT_METRICS;
|
||||||
|
)SHADER" );
|
||||||
|
|
||||||
|
std::string smaa_source =
|
||||||
|
std::string( BUILTIN_SHADERS::smaa_base_shader_p1 )
|
||||||
|
+ std::string( BUILTIN_SHADERS::smaa_base_shader_p2 )
|
||||||
|
+ std::string( BUILTIN_SHADERS::smaa_base_shader_p3 )
|
||||||
|
+ std::string( BUILTIN_SHADERS::smaa_base_shader_p4 );
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set up pass 1 Shader
|
||||||
|
//
|
||||||
|
pass_1_shader.reset( new SHADER() );
|
||||||
|
pass_1_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX,
|
||||||
|
vert_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_1_vertex_shader );
|
||||||
|
pass_1_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT,
|
||||||
|
frag_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_1_fragment_shader );
|
||||||
|
pass_1_shader->Link();
|
||||||
|
checkGlError( "linking pass 1 shader" );
|
||||||
|
|
||||||
|
GLint smaaColorTexParameter = pass_1_shader->AddParameter( "colorTex" ); checkGlError( "pass1: getting colorTex uniform" );
|
||||||
|
pass_1_metrics = pass_1_shader->AddParameter( "SMAA_RT_METRICS" ); checkGlError( "pass1: getting metrics uniform" );
|
||||||
|
|
||||||
|
pass_1_shader->Use(); checkGlError( "pass1: using shader" );
|
||||||
|
pass_1_shader->SetParameter( smaaColorTexParameter, 0 ); checkGlError( "pass1: setting colorTex uniform" );
|
||||||
|
pass_1_shader->Deactivate(); checkGlError( "pass1: deactivating shader" );
|
||||||
|
|
||||||
|
//
|
||||||
|
// set up pass 2 shader
|
||||||
|
//
|
||||||
|
pass_2_shader.reset( new SHADER() );
|
||||||
|
pass_2_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX,
|
||||||
|
vert_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_2_vertex_shader );
|
||||||
|
pass_2_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT,
|
||||||
|
frag_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_2_fragment_shader );
|
||||||
|
pass_2_shader->Link();
|
||||||
|
checkGlError( "linking pass 2 shader" );
|
||||||
|
|
||||||
|
GLint smaaEdgesTexParameter = pass_2_shader->AddParameter( "edgesTex" ); checkGlError( "pass2: getting colorTex uniform" );
|
||||||
|
GLint smaaAreaTexParameter = pass_2_shader->AddParameter( "areaTex" ); checkGlError( "pass2: getting areaTex uniform" );
|
||||||
|
GLint smaaSearchTexParameter = pass_2_shader->AddParameter( "searchTex" ); checkGlError( "pass2: getting searchTex uniform" );
|
||||||
|
pass_2_metrics = pass_2_shader->AddParameter( "SMAA_RT_METRICS" ); checkGlError( "pass2: getting metrics uniform" );
|
||||||
|
|
||||||
|
pass_2_shader->Use(); checkGlError( "pass2: using shader" );
|
||||||
|
pass_2_shader->SetParameter( smaaEdgesTexParameter, 0 ); checkGlError( "pass2: setting colorTex uniform" );
|
||||||
|
pass_2_shader->SetParameter( smaaAreaTexParameter, 1 ); checkGlError( "pass2: setting areaTex uniform" );
|
||||||
|
pass_2_shader->SetParameter( smaaSearchTexParameter, 3 ); checkGlError( "pass2: setting searchTex uniform" );
|
||||||
|
pass_2_shader->Deactivate(); checkGlError( "pass2: deactivating shader" );
|
||||||
|
|
||||||
|
//
|
||||||
|
// set up pass 3 shader
|
||||||
|
//
|
||||||
|
pass_3_shader.reset( new SHADER() );
|
||||||
|
pass_3_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_VERTEX,
|
||||||
|
vert_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_3_vertex_shader );
|
||||||
|
pass_3_shader->LoadShaderFromStrings( KIGFX::SHADER_TYPE_FRAGMENT,
|
||||||
|
frag_preamble, smaa_source, BUILTIN_SHADERS::smaa_pass_3_fragment_shader );
|
||||||
|
pass_3_shader->Link();
|
||||||
|
|
||||||
|
GLint smaaP3ColorTexParameter = pass_3_shader->AddParameter( "colorTex" ); checkGlError( "pass3: getting colorTex uniform" );
|
||||||
|
GLint smaaBlendTexParameter = pass_3_shader->AddParameter( "blendTex" ); checkGlError( "pass3: getting blendTex uniform" );
|
||||||
|
pass_3_metrics = pass_3_shader->AddParameter( "SMAA_RT_METRICS" ); checkGlError( "pass3: getting metrics uniform" );
|
||||||
|
|
||||||
|
pass_3_shader->Use(); checkGlError( "pass3: using shader" );
|
||||||
|
pass_3_shader->SetParameter( smaaP3ColorTexParameter, 0 ); checkGlError( "pass3: setting colorTex uniform" );
|
||||||
|
pass_3_shader->SetParameter( smaaBlendTexParameter, 1 ); checkGlError( "pass3: setting blendTex uniform" );
|
||||||
|
pass_3_shader->Deactivate(); checkGlError( "pass3: deactivating shader" );
|
||||||
|
|
||||||
|
shadersLoaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::updateUniforms()
|
||||||
|
{
|
||||||
|
auto dims = compositor->GetScreenSize();
|
||||||
|
|
||||||
|
pass_1_shader->Use(); checkGlError( "pass1: using shader" );
|
||||||
|
pass_1_shader->SetParameter( pass_1_metrics,
|
||||||
|
1.f / float( dims.x ), 1.f / float( dims.y ), float( dims.x ), float( dims.y ) ); checkGlError( "pass1: setting metrics uniform" );
|
||||||
|
pass_1_shader->Deactivate(); checkGlError( "pass1: deactivating shader" );
|
||||||
|
|
||||||
|
pass_2_shader->Use(); checkGlError( "pass2: using shader" );
|
||||||
|
pass_2_shader->SetParameter( pass_2_metrics,
|
||||||
|
1.f / float( dims.x ), 1.f / float( dims.y ), float( dims.x ), float( dims.y ) ); checkGlError( "pass2: setting metrics uniform" );
|
||||||
|
pass_2_shader->Deactivate(); checkGlError( "pass2: deactivating shader" );
|
||||||
|
|
||||||
|
pass_3_shader->Use(); checkGlError( "pass3: using shader" );
|
||||||
|
pass_3_shader->SetParameter( pass_3_metrics,
|
||||||
|
1.f / float( dims.x ), 1.f / float( dims.y ), float( dims.x ), float( dims.y ) ); checkGlError( "pass3: setting metrics uniform" );
|
||||||
|
pass_3_shader->Deactivate(); checkGlError( "pass3: deactivating shader" );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ANTIALIASING_SMAA::Init()
|
||||||
|
{
|
||||||
|
if(!shadersLoaded) {
|
||||||
|
loadShaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!areBuffersInitialized) {
|
||||||
|
smaaBaseBuffer = compositor->CreateBuffer();
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||||
|
|
||||||
|
smaaEdgesBuffer = compositor->CreateBuffer();
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||||
|
|
||||||
|
smaaBlendBuffer = compositor->CreateBuffer();
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
|
||||||
|
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
|
||||||
|
|
||||||
|
updateUniforms();
|
||||||
|
areBuffersInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing to initialize
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::OnLostBuffers()
|
||||||
|
{
|
||||||
|
areBuffersInitialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ANTIALIASING_SMAA::CreateBuffer()
|
||||||
|
{
|
||||||
|
return compositor->CreateBuffer( compositor->GetScreenSize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::DrawBuffer( GLuint buffer )
|
||||||
|
{
|
||||||
|
// draw to internal buffer
|
||||||
|
compositor->DrawBuffer( buffer, smaaBaseBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::Begin()
|
||||||
|
{
|
||||||
|
compositor->SetBuffer( smaaBaseBuffer );
|
||||||
|
compositor->ClearBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void draw_fullscreen_triangle()
|
||||||
|
{
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
glMatrixMode( GL_PROJECTION );
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity();
|
||||||
|
|
||||||
|
glBegin( GL_TRIANGLES );
|
||||||
|
glTexCoord2f( 0.0f, 1.0f );
|
||||||
|
glVertex2f( -1.0f, 1.0f );
|
||||||
|
glTexCoord2f( 0.0f, -1.0f );
|
||||||
|
glVertex2f( -1.0f, -3.0f );
|
||||||
|
glTexCoord2f( 2.0f, 1.0f );
|
||||||
|
glVertex2f( 3.0f, 1.0f );
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
glMatrixMode( GL_MODELVIEW );
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ANTIALIASING_SMAA::Present()
|
||||||
|
{
|
||||||
|
auto sourceTexture = compositor->GetBufferTexture( smaaBaseBuffer );
|
||||||
|
|
||||||
|
glDisable( GL_BLEND );
|
||||||
|
glDisable( GL_DEPTH_TEST );
|
||||||
|
glEnable( GL_TEXTURE_2D );
|
||||||
|
|
||||||
|
//
|
||||||
|
// pass 1: main-buffer -> smaaEdgesBuffer
|
||||||
|
//
|
||||||
|
compositor->SetBuffer( smaaEdgesBuffer );
|
||||||
|
compositor->ClearBuffer();
|
||||||
|
|
||||||
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, sourceTexture ); checkGlError( "binding colorTex" );
|
||||||
|
pass_1_shader->Use(); checkGlError( "using smaa pass 1 shader" );
|
||||||
|
draw_fullscreen_triangle();
|
||||||
|
pass_1_shader->Deactivate();
|
||||||
|
|
||||||
|
//
|
||||||
|
// pass 2: smaaEdgesBuffer -> smaaBlendBuffer
|
||||||
|
//
|
||||||
|
compositor->SetBuffer( smaaBlendBuffer );
|
||||||
|
compositor->ClearBuffer();
|
||||||
|
|
||||||
|
auto edgesTex = compositor->GetBufferTexture( smaaEdgesBuffer );
|
||||||
|
|
||||||
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, edgesTex );
|
||||||
|
glActiveTexture( GL_TEXTURE1 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, smaaAreaTex );
|
||||||
|
glActiveTexture( GL_TEXTURE3 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, smaaSearchTex );
|
||||||
|
|
||||||
|
pass_2_shader->Use();
|
||||||
|
draw_fullscreen_triangle();
|
||||||
|
pass_2_shader->Deactivate();
|
||||||
|
|
||||||
|
//
|
||||||
|
// pass 3: colorTex + BlendBuffer -> output
|
||||||
|
//
|
||||||
|
compositor->SetBuffer( OPENGL_COMPOSITOR::DIRECT_RENDERING );
|
||||||
|
compositor->ClearBuffer();
|
||||||
|
auto blendTex = compositor->GetBufferTexture( smaaBlendBuffer );
|
||||||
|
|
||||||
|
glActiveTexture( GL_TEXTURE0 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, sourceTexture );
|
||||||
|
glActiveTexture( GL_TEXTURE1 );
|
||||||
|
glBindTexture( GL_TEXTURE_2D, blendTex );
|
||||||
|
|
||||||
|
pass_3_shader->Use();
|
||||||
|
draw_fullscreen_triangle();
|
||||||
|
pass_3_shader->Deactivate();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,49 @@ namespace KIGFX {
|
||||||
std::unique_ptr< SHADER > x4_shader;
|
std::unique_ptr< SHADER > x4_shader;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ANTIALIASING_SMAA : public OPENGL_PRESENTOR {
|
||||||
|
public:
|
||||||
|
ANTIALIASING_SMAA ( OPENGL_COMPOSITOR* aCompositor );
|
||||||
|
|
||||||
|
bool Init() override;
|
||||||
|
unsigned int CreateBuffer () override;
|
||||||
|
|
||||||
|
VECTOR2U GetInternalBufferSize() override;
|
||||||
|
void OnLostBuffers () override;
|
||||||
|
|
||||||
|
void Begin() override;
|
||||||
|
void DrawBuffer( GLuint buffer ) override;
|
||||||
|
void Present () override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void loadShaders ();
|
||||||
|
void updateUniforms ();
|
||||||
|
|
||||||
|
bool areBuffersInitialized; //
|
||||||
|
bool isInitialized; // shaders linked
|
||||||
|
|
||||||
|
unsigned int smaaBaseBuffer; // base + overlay temporary
|
||||||
|
unsigned int smaaEdgesBuffer;
|
||||||
|
unsigned int smaaBlendBuffer;
|
||||||
|
|
||||||
|
// smaa shader lookup textures
|
||||||
|
unsigned int smaaAreaTex;
|
||||||
|
unsigned int smaaSearchTex;
|
||||||
|
|
||||||
|
bool shadersLoaded;
|
||||||
|
|
||||||
|
std::unique_ptr< SHADER > pass_1_shader;
|
||||||
|
GLint pass_1_metrics;
|
||||||
|
|
||||||
|
std::unique_ptr< SHADER > pass_2_shader;
|
||||||
|
GLint pass_2_metrics;
|
||||||
|
|
||||||
|
std::unique_ptr< SHADER > pass_3_shader;
|
||||||
|
GLint pass_3_metrics;
|
||||||
|
|
||||||
|
OPENGL_COMPOSITOR* compositor;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -11,6 +11,18 @@ namespace KIGFX {
|
||||||
extern const char ssaa_x4_vertex_shader[];
|
extern const char ssaa_x4_vertex_shader[];
|
||||||
extern const char ssaa_x4_fragment_shader[];
|
extern const char ssaa_x4_fragment_shader[];
|
||||||
|
|
||||||
|
extern const char smaa_base_shader_p1[];
|
||||||
|
extern const char smaa_base_shader_p2[];
|
||||||
|
extern const char smaa_base_shader_p3[];
|
||||||
|
extern const char smaa_base_shader_p4[];
|
||||||
|
|
||||||
|
extern const char smaa_pass_1_vertex_shader[];
|
||||||
|
extern const char smaa_pass_1_fragment_shader[];
|
||||||
|
extern const char smaa_pass_2_vertex_shader[];
|
||||||
|
extern const char smaa_pass_2_fragment_shader[];
|
||||||
|
extern const char smaa_pass_3_vertex_shader[];
|
||||||
|
extern const char smaa_pass_3_fragment_shader[];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,8 @@ OPENGL_COMPOSITOR::OPENGL_COMPOSITOR() :
|
||||||
m_initialized( false ), m_curBuffer( 0 ),
|
m_initialized( false ), m_curBuffer( 0 ),
|
||||||
m_mainFbo( 0 ), m_depthBuffer( 0 ), m_curFbo( DIRECT_RENDERING )
|
m_mainFbo( 0 ), m_depthBuffer( 0 ), m_curFbo( DIRECT_RENDERING )
|
||||||
{
|
{
|
||||||
m_antialiasing.reset( new ANTIALIASING_SUPERSAMPLING( this, SUPERSAMPLING_MODE::X4 ) );
|
//m_antialiasing.reset( new ANTIALIASING_SUPERSAMPLING( this, SUPERSAMPLING_MODE::X4 ) );
|
||||||
|
m_antialiasing.reset( new ANTIALIASING_SMAA( this ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,12 @@ void SHADER::SetParameter( int parameterNumber, int value ) const
|
||||||
glUniform1i( parameterLocation[parameterNumber], value );
|
glUniform1i( parameterLocation[parameterNumber], value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHADER::SetParameter( int parameterNumber, float f0, float f1, float f2, float f3 ) const
|
||||||
|
{
|
||||||
|
assert( (unsigned)parameterNumber < parameterLocation.size() );
|
||||||
|
float arr[4] = { f0, f1, f2, f3 };
|
||||||
|
glUniform4fv( parameterLocation[parameterNumber], 1, arr );
|
||||||
|
}
|
||||||
|
|
||||||
int SHADER::GetAttribute( std::string aAttributeName ) const
|
int SHADER::GetAttribute( std::string aAttributeName ) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -182,6 +182,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void SetParameter( int aParameterNumber, float aValue ) const;
|
void SetParameter( int aParameterNumber, float aValue ) const;
|
||||||
void SetParameter( int aParameterNumber, int aValue ) const;
|
void SetParameter( int aParameterNumber, int aValue ) const;
|
||||||
|
void SetParameter( int aParameterNumber, float f0, float f1, float f2, float f3 ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets an attribute location.
|
* @brief Gets an attribute location.
|
||||||
|
|
Loading…
Reference in New Issue