Remove the old blur effect.

svn path=/trunk/KDE/kdebase/workspace/; revision=1099609
This commit is contained in:
Fredrik Höglund 2010-03-05 20:26:49 +00:00
parent dc233bdcd5
commit 48c3a09119
8 changed files with 0 additions and 765 deletions

View file

@ -1,20 +0,0 @@
#######################################
# Effect
# Source files
set( kwin4_effect_builtins_sources ${kwin4_effect_builtins_sources}
blur/blur.cpp
)
# .desktop files
install( FILES
blur/blur.desktop
DESTINATION ${SERVICES_INSTALL_DIR}/kwin )
# Data files
install( FILES
blur/data/blur.frag
blur/data/blur.vert
blur/data/blur-render.frag
blur/data/blur-render.vert
DESTINATION ${DATA_INSTALL_DIR}/kwin )

View file

@ -1,388 +0,0 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "blur.h"
#include <kwinglutils.h>
#include <QString>
#include <kdebug.h>
namespace KWin
{
KWIN_EFFECT( blur, BlurEffect )
KWIN_EFFECT_SUPPORTED( blur, BlurEffect::supported() )
BlurEffect::BlurEffect() : Effect()
{
mSceneTexture = 0;
mTmpTexture = 0;
mBlurTexture = 0;
mSceneTarget = 0;
mTmpTarget = 0;
mBlurTarget = 0;
mBlurShader = 0;
mWindowShader = 0;
mBlurRadius = 4;
mValid = loadData();
if( !mValid )
{
kWarning(1212) << "Loading failed";
}
effects->addRepaintFull();
}
BlurEffect::~BlurEffect()
{
effects->addRepaintFull();
delete mSceneTexture;
delete mTmpTexture;
delete mBlurTexture;
delete mSceneTarget;
delete mTmpTarget;
delete mBlurTarget;
delete mBlurShader;
delete mWindowShader;
}
bool BlurEffect::loadData()
{
// Create texture and render target
int texw = displayWidth();
int texh = displayHeight();
if( !GLTexture::NPOTTextureSupported() )
{
kWarning( 1212 ) << "NPOT textures not supported, wasting some memory" ;
texw = nearestPowerOfTwo(texw);
texh = nearestPowerOfTwo(texh);
}
mSceneTexture = new GLTexture(texw, texh);
mSceneTexture->setFilter(GL_LINEAR);
mTmpTexture = new GLTexture(texw, texh);
mTmpTexture->setFilter(GL_LINEAR);
mBlurTexture = new GLTexture(texw, texh);
mSceneTarget = new GLRenderTarget(mSceneTexture);
if( !mSceneTarget->valid() )
return false;
mTmpTarget = new GLRenderTarget(mTmpTexture);
if( !mTmpTarget->valid() )
return false;
mBlurTarget = new GLRenderTarget(mBlurTexture);
if( !mBlurTarget->valid() )
return false;
mBlurShader = loadShader("blur");
if( !mBlurShader )
return false;
mWindowShader = loadShader("blur-render");
if( !mWindowShader )
return false;
mBlurShader->bind();
mBlurShader->setUniform("inputTex", 0);
mBlurShader->setUniform("textureWidth", (float)texw);
mBlurShader->setUniform("textureHeight", (float)texh);
mBlurShader->unbind();
mWindowShader->bind();
mWindowShader->setUniform("windowTex", 0);
mWindowShader->setUniform("backgroundTex", 4);
mWindowShader->setUniform("blurTextureWidth", (float)texw);
mWindowShader->setUniform("blurTextureHeight", (float)texh);
mWindowShader->unbind();
return true;
}
GLShader* BlurEffect::loadShader(const QString& name)
{
QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/" + name + ".frag");
QString vertexshader = KGlobal::dirs()->findResource("data", "kwin/" + name + ".vert");
if(fragmentshader.isEmpty() || vertexshader.isEmpty())
{
kError(1212) << "Couldn't locate shader files for '" << name << "'" << endl;
return false;
}
GLShader* shader = new GLShader(vertexshader, fragmentshader);
if(!shader->isValid())
{
kError(1212) << "Shader '" << name << "' failed to load!" << endl;
delete shader;
return 0;
}
return shader;
}
bool BlurEffect::supported()
{
return GLRenderTarget::supported() &&
GLShader::fragmentShaderSupported() &&
(effects->compositingType() == OpenGLCompositing);
}
QRegion BlurEffect::expandedRegion( const QRegion& region ) const
{
QRegion expandedregion;
foreach( const QRect& r, region.rects() )
expandedregion += r.adjusted( -mBlurRadius, -mBlurRadius, mBlurRadius, mBlurRadius );
return expandedregion;
}
void BlurEffect::prePaintScreen( ScreenPrePaintData& data, int time )
{
mTransparentWindows = 0;
mScreenDirty = QRegion();
mBlurDirty = QRegion();
mBlurMask = QRegion();
effects->prePaintScreen(data, time);
}
void BlurEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time )
{
// Expand the painted area
mBlurMask |= expandedRegion( data.paint );
data.paint |= expandedRegion( mBlurMask );
effects->prePaintWindow( w, data, time );
if( w->isPaintingEnabled() && ( data.mask & PAINT_WINDOW_TRANSLUCENT ))
mTransparentWindows++;
data.setTranslucent();
}
void BlurEffect::paintScreen( int mask, QRegion region, ScreenPaintData& data )
{
// TODO: prePaintWindow() gets called _after_ paintScreen(), so we have no
// way of knowing here whether there will be any translucent windows or
// not. If we'd know that there's no translucent windows then we could
// render straight onto screen, saving some time.
// HACK disable blur when there is a fullscreen effects. Needed for e.g. cube to work
if( mValid && !effects->activeFullScreenEffect() /*&& mTransparentWindows*/ )
{
// rendering everything onto render target
effects->pushRenderTarget(mSceneTarget);
effects->paintScreen( mask, region, data );
effects->popRenderTarget();
// Copy changed areas back onto screen
mScreenDirty &= mBlurMask;
if( !mScreenDirty.isEmpty() )
{
if( mask & PAINT_SCREEN_TRANSFORMED )
{
// We don't want any transformations when working with our own
// textures, so load an identity matrix
glMatrixMode( GL_MODELVIEW );
glPushMatrix();
glLoadIdentity();
}
GLTexture* tex = mSceneTexture;
int pixels = 0;
tex->bind();
tex->enableUnnormalizedTexCoords();
foreach( QRect r, mScreenDirty.rects() ) // krazy:exclude=foreach
{
r.adjust(0, -1, 0, -1);
int rx2 = r.x() + r.width();
int ry2 = r.y() + r.height();
glBegin(GL_QUADS);
glTexCoord2f( r.x(), ry2 ); glVertex2f( r.x(), ry2 );
glTexCoord2f( rx2 , ry2 ); glVertex2f( rx2 , ry2 );
glTexCoord2f( rx2 , r.y() ); glVertex2f( rx2 , r.y() );
glTexCoord2f( r.x(), r.y() ); glVertex2f( r.x(), r.y() );
glEnd();
pixels += r.width()*r.height();
}
tex->disableUnnormalizedTexCoords();
tex->unbind();
if( mask & PAINT_SCREEN_TRANSFORMED )
{
// Restore the original matrix
glPopMatrix();
}
// kDebug(1212) << "Copied" << mScreenDirty.rects().count() << "rects, pixels:" << pixels;
}
}
else
{
effects->paintScreen( mask, region, data );
}
}
void BlurEffect::drawWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data )
{
// HACK disable blur when there is a fullscreen effects. Needed for e.g. cube to work
if( mValid && !effects->activeFullScreenEffect() /*&& mTransparentWindows*/ )
{
if( mask & PAINT_WINDOW_TRANSLUCENT &&
((data.opacity != 1.0 || data.contents_opacity != 1.0 || data.decoration_opacity != 1.0 ) ||
w->hasAlpha()))
{
double blurAmount = data.opacity;
if( blurAmount >= 1.0 )
{
blurAmount = data.contents_opacity;
if( blurAmount >= 1.0 )
{
blurAmount = data.decoration_opacity;
if( blurAmount >= 1.0 )
blurAmount = 1.0;
}
}
// Round to nearest 0.05
blurAmount = double( qRound( blurAmount * 20.0 )) / 20.0;
// Make sure the blur texture is up to date
if( mask & PAINT_SCREEN_TRANSFORMED )
{
// We don't want any transformations when working with our own
// textures, so load an identity matrix
glPushMatrix();
glLoadIdentity();
}
// If we're having transformations, we don't know the window's
// transformed position on the screen and thus have to update the
// entire screen
if( mask & ( PAINT_WINDOW_TRANSFORMED | PAINT_SCREEN_TRANSFORMED | PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS ) )
updateBlurTexture( QRegion(0, 0, displayWidth(), displayHeight()) , blurAmount );
else
updateBlurTexture( mBlurDirty , blurAmount );
mBlurDirty = QRegion();
if( mask & PAINT_SCREEN_TRANSFORMED )
// Restore the original matrix
glPopMatrix();
// Set custom shader to render the window with
mWindowShader->bind();
data.shader = mWindowShader;
// Put the blur texture to tex unit 4
glActiveTexture(GL_TEXTURE4);
mBlurTexture->bind();
glActiveTexture(GL_TEXTURE0);
// Paint
effects->drawWindow( w, mask, region, data );
// Disable blur texture and shader
glActiveTexture(GL_TEXTURE4);
mBlurTexture->unbind();
glActiveTexture(GL_TEXTURE0);
mWindowShader->unbind();
}
else
{
// Opaque window
// Paint to the rendertarget (which is already being used)
effects->drawWindow( w, mask, region, data );
}
// Mark the window's region as dirty
mScreenDirty += region;
mBlurDirty += region & mBlurMask;
}
else
// If there are no translucent windows then paint as usual
effects->drawWindow( w, mask, region, data );
}
void BlurEffect::updateBlurTexture(const QRegion& region, double blurAmount )
{
QRect bounding = region.boundingRect();
QVector<QRect> rects = region.rects();
int totalarea = 0;
foreach( const QRect &r, rects )
totalarea += r.width() * r.height();
if( (int)(totalarea * 1.33 + 100 ) < bounding.width() * bounding.height() )
{
// Use small rects
updateBlurTexture(rects, blurAmount);
}
else
{
// Bounding rect is probably cheaper
QVector<QRect> tmp( 1, bounding );
updateBlurTexture( tmp , blurAmount );
}
}
void BlurEffect::updateBlurTexture(const QVector<QRect>& rects, double blurAmount )
{
// Blur
// First pass (vertical)
mBlurShader->bind();
effects->pushRenderTarget(mTmpTarget);
mBlurShader->setAttribute("xBlur", 0.0f);
mBlurShader->setAttribute("yBlur", float(blurAmount) );
mSceneTexture->bind();
foreach( const QRect &r, rects )
{
// We change x coordinates here because horizontal blur pass (which
// comes after this one) also uses pixels that are horizontally edging
// the blurred area. Thus we need to make sure that those pixels are
// also updated.
glBegin(GL_QUADS);
glVertex2f( r.x()-mBlurRadius , r.y() + r.height() );
glVertex2f( r.x() + r.width()+mBlurRadius, r.y() + r.height() );
glVertex2f( r.x() + r.width()+mBlurRadius, r.y() );
glVertex2f( r.x()-mBlurRadius , r.y() );
glEnd();
}
mSceneTexture->unbind();
effects->popRenderTarget();
// Second pass (horizontal)
effects->pushRenderTarget(mBlurTarget);
mBlurShader->setAttribute("xBlur", float(blurAmount) );
mBlurShader->setAttribute("yBlur", 0.0f);
mTmpTexture->bind();
foreach( const QRect &r, rects )
{
glBegin(GL_QUADS);
glVertex2f( r.x() , r.y() + r.height() );
glVertex2f( r.x() + r.width(), r.y() + r.height() );
glVertex2f( r.x() + r.width(), r.y() );
glVertex2f( r.x() , r.y() );
glEnd();
}
mTmpTexture->unbind();
effects->popRenderTarget();
mBlurShader->unbind();
}
} // namespace

View file

@ -1,159 +0,0 @@
[Desktop Entry]
Name=Blur
Name[af]=Blur
Name[ar]=غشاوة
Name[be]=Blur
Name[bg]=Замъгляване
Name[bn]=
Name[bn_IN]=Blur ()
Name[ca]=Difuminat
Name[ca@valencia]=Difuminat
Name[cs]=Rozostření
Name[csb]=Rozmazóné
Name[da]=Slør
Name[de]=Verwischen
Name[el]=Θόλωμα
Name[en_GB]=Blur
Name[eo]=Malklarigi
Name[es]=Desenfocar
Name[et]=Hägu
Name[eu]=Lausotu
Name[fa]=محو
Name[fi]=Blur
Name[fr]=Flou
Name[fy]=Ferfagje
Name[ga]=Blur
Name[gl]=Desenfocar
Name[gu]=
Name[he]=טשטש
Name[hi]=
Name[hne]=
Name[hr]=Mrlja
Name[hsb]=Młowojty
Name[hu]=Elmosódás
Name[id]=Samar
Name[is]=Móða
Name[it]=Sfocatura
Name[ja]=
Name[kk]=Бұлдыр
Name[km]=
Name[kn]=ಿ ()
Name[ko]=
Name[ku]=Blur
Name[lt]=Suliejimas
Name[lv]=Aizmiglot
Name[mai]=
Name[mk]=Заматување
Name[ml]=ി
Name[mr]=
Name[nb]=Slør
Name[nds]=Verwischen
Name[ne]=
Name[nl]=Vervagen
Name[nn]=Uklar
Name[pa]=
Name[pl]=Rozmycie
Name[pt]=BlueFish
Name[pt_BR]=Borrar
Name[ro]=Estompare
Name[ru]=Размытие
Name[se]=Seagas
Name[si]=
Name[sk]=Rozmazanie
Name[sl]=Zameglitev
Name[sr]=Замућење
Name[sr@ijekavian]=Замућење
Name[sr@ijekavianlatin]=Zamućenje
Name[sr@latin]=Zamućenje
Name[sv]=Oskärpa
Name[ta]=
Name[te]=
Name[tg]=Шуста
Name[th]=
Name[tr]=Bulanıklaştırma
Name[uk]=Розмивання
Name[vi]=Che m
Name[wa]=Flou
Name[x-test]=xxBlurxx
Name[zh_CN]=
Name[zh_TW]=
Icon=preferences-system-windows-effect-blur
Comment=Blurs the background behind semi-transparent windows
Comment[ar]=تغشي الخلفية التي خلف النوافذ شبه الشفافة.
Comment[bg]=Замъгляване на фона на полупрозрачни прозорци
Comment[ca]=Difumina el fons de darrere de les finestres semitransparents
Comment[ca@valencia]=Difumina el fons de darrere de les finestres semitransparents
Comment[cs]=Rozostří pozadí poloprůhledných oken
Comment[csb]=Rozmazëje spòdla półprzezérnych òknów
Comment[da]=Slører baggrunden bag halvgennemsigtige vinduer
Comment[de]=Verwischt den Hintergrund halbtransparenter Fenster.
Comment[el]=Θόλωμα του φόντου πίσω από ημιδιαφανή παράθυρα
Comment[en_GB]=Blurs the background behind semi-transparent windows
Comment[eo]=Malklarigas la fonon de duon-travideblaj fenestroj
Comment[es]=Desenfoca el fondo de una ventana semi-transparente
Comment[et]=Poolläbipaistvate akende tausta hägustamine
Comment[eu]=Lausto atzekoaldea leiho erdigardenen atzean
Comment[fi]=Sumentaa puoliksi läpinäkyvien ikkunoiden taustan
Comment[fr]=Rend flou l'arrière-plan sous les fenêtres semi-transparentes
Comment[fy]=Ferfaget de eftergrûn fan healtrochsichtige finsters
Comment[ga]=Geamhaigh an cúlra taobh thiar d'fhuinneoga leath-thrédhearcacha
Comment[gl]=Desenfoca o fondo tras das fiestras semitransparentes
Comment[gu]= - િ
Comment[he]=טישטוש הרקע של חלונות שקופים למחצה
Comment[hi]=- ि ि
Comment[hne]= ि ि
Comment[hr]=Zamrlja pozadinu iza poluprozirnih prozora
Comment[hsb]=Stwori młowojty pozadk za połpřewidnymi woknami.
Comment[hu]=Elmosódottá teszi a félig áttetsző ablakok hátterét
Comment[id]=Samarkan latar belakang di belakang jendela semi-transparan
Comment[is]=Móðar bakgrunn aftan við hálfgegnsæa glugga
Comment[it]=Sfoca lo sfondo dietro le finestre semitrasparenti
Comment[ja]=
Comment[kk]=Шала мөлдір терезелердің аясын бұлдырлатады
Comment[km]=
Comment[kn]=- ಿಿ ಿ ಿ
Comment[ko]=
Comment[lt]=Sulieja pusiau permatomų langų foną
Comment[lv]=Aizmiglo fonu aiz puscaurspīdīgiem logiem
Comment[mk]=Ја заматува подлогата зад полупроѕирни прозорци
Comment[ml]=ി ി ി.
Comment[mr]=-
Comment[nb]=Slører bakgrunnen til delvis gjennomsiktige vinduer
Comment[nds]=Verwischt den Achtergrund achter halfdörsichtig Finstern
Comment[nl]=Vervaagt de achtergrond van halftransparante vensters
Comment[nn]=Gjer bakgrunnen til halvgjennomsiktige vindauge uklar
Comment[pa]= (-) () ਿ
Comment[pl]=Rozmywa tło za półprzezroczystymi oknami
Comment[pt]=Borra o fundo por trás das janelas semi-transparentes
Comment[pt_BR]=Borra o plano de fundo por trás das janelas semi-transparentes
Comment[ro]=Estompează fundalul în spatele ferestrelor semitransparente
Comment[ru]=Показывать размытый фон под полупрозрачным окном
Comment[si]=
Comment[sk]=Rozmaže pozadie za polopriehľadnými oknami
Comment[sl]=Zamegli ozadje za na pol prozornmi okni
Comment[sr]=Замућује позадину иза полупровидних прозора
Comment[sr@ijekavian]=Замућује позадину иза полупровидних прозора
Comment[sr@ijekavianlatin]=Zamućuje pozadinu iza poluprovidnih prozora
Comment[sr@latin]=Zamućuje pozadinu iza poluprovidnih prozora
Comment[sv]=Gör bakgrunden bakom halvgenomskinliga fönster suddig
Comment[ta]=Blurs the background behind semi-transparent windows
Comment[th]=
Comment[tr]=Yarı şeffaf pencerelerin arkaplanını bulanıklaştırır
Comment[uk]=Розмивання тла напівпрозорих вікон
Comment[wa]=Rind flou l' fond pa drî les purneas dmey transparints
Comment[x-test]=xxBlurs the background behind semi-transparent windowsxx
Comment[zh_CN]=
Comment[zh_TW]=
Type=Service
X-KDE-ServiceTypes=KWin/Effect
X-KDE-PluginInfo-Author=Rivo Laks
X-KDE-PluginInfo-Email=rivolaks@hot.ee
X-KDE-PluginInfo-Name=kwin4_effect_blur
X-KDE-PluginInfo-Version=0.2.0
X-KDE-PluginInfo-Category=Appearance
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=false
X-KDE-Library=kwin4_effect_builtins
X-KDE-Ordering=85

View file

@ -1,86 +0,0 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_BLUR_H
#define KWIN_BLUR_H
// Include with base class for effects.
#include <kwineffects.h>
#include <QRegion>
template< class T > class QVector;
namespace KWin
{
class GLRenderTarget;
class GLTexture;
class GLShader;
/**
* Blurs the background of translucent windows
**/
class BlurEffect : public Effect
{
public:
BlurEffect();
~BlurEffect();
virtual void prePaintScreen( ScreenPrePaintData& data, int time );
virtual void paintScreen( int mask, QRegion region, ScreenPaintData& data );
virtual void prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time );
virtual void drawWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
static bool supported();
protected:
bool loadData();
GLShader* loadShader(const QString& name);
void updateBlurTexture(const QVector<QRect>& rects, double blurAmount );
void updateBlurTexture(const QRegion& region , double blurAmount );
QRegion expandedRegion( const QRegion& r ) const;
private:
GLTexture* mSceneTexture;
GLTexture* mTmpTexture;
GLTexture* mBlurTexture;
GLRenderTarget* mSceneTarget;
GLRenderTarget* mTmpTarget;
GLRenderTarget* mBlurTarget;
GLShader* mBlurShader;
GLShader* mWindowShader;
bool mValid;
int mBlurRadius;
int mTransparentWindows;
QRegion mBlurDirty;
QRegion mScreenDirty;
QRegion mBlurMask;
};
} // namespace
#endif

View file

@ -1,40 +0,0 @@
uniform sampler2D windowTex;
uniform sampler2D backgroundTex;
uniform float blurTextureWidth;
uniform float blurTextureHeight;
uniform float opacity;
uniform float saturation;
uniform float brightness;
// Converts pixel coordinates to texture coordinates
vec2 pix2tex(vec2 pix)
{
return vec2(pix.x / blurTextureWidth, pix.y / blurTextureHeight);
}
// Returns color of the window at given texture coordinate, taking into
// account brightness and saturation, but not opacity
vec4 windowColor(vec2 texcoord)
{
vec4 color = texture2D(windowTex, texcoord);
// Apply saturation
float grayscale = dot(vec3(0.30, 0.59, 0.11), color.rgb);
color.rgb = mix(vec3(grayscale), color.rgb, saturation);
// Apply brightness
color.rgb = color.rgb * brightness;
// and return
return color;
}
void main()
{
vec2 blurtexcoord = pix2tex(gl_FragCoord.xy);
vec4 winColor = windowColor(gl_TexCoord[0].xy);
vec3 tex = mix(texture2D(backgroundTex, blurtexcoord).rgb,
winColor.rgb, winColor.a * opacity);
gl_FragColor = vec4(tex, pow(winColor.a, 0.2));
}

View file

@ -1,5 +0,0 @@
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0 * gl_TextureMatrix[0];
gl_Position = ftransform();
}

View file

@ -1,39 +0,0 @@
uniform sampler2D inputTex;
varying vec2 samplePos1;
varying vec2 samplePos2;
varying vec2 samplePos3;
varying vec2 samplePos4;
varying vec2 samplePos5;
// If defined, use five samples (blur radius = 5), otherwise 3 samples (radius = 3)
#define FIVE_SAMPLES
vec3 blurTex(vec2 pos, float strength)
{
return texture2D(inputTex, pos).rgb * strength;
}
void main()
{
// Do the gaussian blur
// This blur actually has a radius of 4, but we take advantage of gpu's
// linear texture filtering, so e.g. 1.5 actually gives us both texels
// 1 and 2
#ifdef FIVE_SAMPLES
vec3 tex = blurTex(samplePos1, 0.30);
tex += blurTex(samplePos2, 0.25);
tex += blurTex(samplePos3, 0.25);
tex += blurTex(samplePos4, 0.1);
tex += blurTex(samplePos5, 0.1);
#else
vec3 tex = blurTex(samplePos1, 0.40);
tex += blurTex(samplePos2, 0.30);
tex += blurTex(samplePos3, 0.30);
#endif
gl_FragColor = vec4(tex, 1.0);
}

View file

@ -1,28 +0,0 @@
varying vec2 samplePos1;
varying vec2 samplePos2;
varying vec2 samplePos3;
varying vec2 samplePos4;
varying vec2 samplePos5;
uniform float textureWidth;
uniform float textureHeight;
attribute float xBlur;
attribute float yBlur;
vec2 mkSamplePos(vec2 origin, float offset)
{
vec2 foo = origin + vec2(xBlur, yBlur) * offset;
return vec2(foo.x / textureWidth, 1.0 - foo.y / textureHeight);
}
void main()
{
samplePos1 = mkSamplePos(gl_Vertex.xy, 0.0);
samplePos2 = mkSamplePos(gl_Vertex.xy, -1.5);
samplePos3 = mkSamplePos(gl_Vertex.xy, 1.5);
samplePos4 = mkSamplePos(gl_Vertex.xy, 3.5);
samplePos5 = mkSamplePos(gl_Vertex.xy, -3.5);
gl_Position = ftransform();
}