3D: Cleanup bloom effect

This commit is contained in:
kaetemi 2014-08-03 21:09:55 +02:00
parent 2bccba1ddc
commit f03f73e5c8
5 changed files with 44 additions and 15 deletions

View file

@ -974,6 +974,9 @@ public:
) = 0; ) = 0;
// @} // @}
/// Hack for bloom
virtual bool textureCoordinateAlternativeMode() const = 0;
/// \name Render state: Polygon mode /// \name Render state: Polygon mode

View file

@ -112,6 +112,9 @@ void CBloomEffect::init()
if (!((CDriverUser *)_Driver)->getDriver()->supportBloomEffect()) if (!((CDriverUser *)_Driver)->getDriver()->supportBloomEffect())
return; return;
CDriverUser *dru = static_cast<CDriverUser *>(_Driver);
IDriver *drv = dru->getDriver();
_BlurWidth = 256; _BlurWidth = 256;
_BlurHeight = 256; _BlurHeight = 256;
@ -218,10 +221,20 @@ void CBloomEffect::init()
_BlurQuad.V1 = CVector(1.f, -1.f, 0.5f); _BlurQuad.V1 = CVector(1.f, -1.f, 0.5f);
_BlurQuad.V2 = CVector(1.f, 1.f, 0.5f); _BlurQuad.V2 = CVector(1.f, 1.f, 0.5f);
_BlurQuad.V3 = CVector(-1.f, 1.f, 0.5f); _BlurQuad.V3 = CVector(-1.f, 1.f, 0.5f);
if (drv->textureCoordinateAlternativeMode())
{
_BlurQuad.Uv0 = CUV(0.f, 1.f);
_BlurQuad.Uv1 = CUV(1.f, 1.f);
_BlurQuad.Uv2 = CUV(1.f, 0.f);
_BlurQuad.Uv3 = CUV(0.f, 0.f);
}
else
{
_BlurQuad.Uv0 = CUV(0.f, 0.f); _BlurQuad.Uv0 = CUV(0.f, 0.f);
_BlurQuad.Uv1 = CUV(1.f, 0.f); _BlurQuad.Uv1 = CUV(1.f, 0.f);
_BlurQuad.Uv2 = CUV(1.f, 1.f); _BlurQuad.Uv2 = CUV(1.f, 1.f);
_BlurQuad.Uv3 = CUV(0.f, 1.f); _BlurQuad.Uv3 = CUV(0.f, 1.f);
}
_Init = true; _Init = true;
} }
@ -395,20 +408,30 @@ void CBloomEffect::doBlur(bool horizontalBlur)
// set several decal constants in order to obtain in the render target texture a mix of color // set several decal constants in order to obtain in the render target texture a mix of color
// of a texel and its neighbored texels on the axe of the pass. // of a texel and its neighbored texels on the axe of the pass.
float decalL, decal2L, decalR, decal2R; float decalL, decal2L, decalR, decal2R;
// if(_InitBloomEffect) if (drvInternal->textureCoordinateAlternativeMode())
// { {
if (horizontalBlur)
{
decalL = 0.5f;
decal2L = -0.5f;
decalR = 1.5f;
decal2R = 2.5f;
}
else
{
decalL = 0.0f;
decal2L = -1.0f;
decalR = 1.0f;
decal2R = 2.0f;
}
}
else
{
decalL = -0.5f; decalL = -0.5f;
decal2L = -1.5f; decal2L = -1.5f;
decalR = 0.5f; decalR = 0.5f;
decal2R = 1.5f; decal2R = 1.5f;
// } }
// else
// {
// decalL = 0.f;
// decal2L = -1.f;
// decalR = 1.f;
// decal2R = 2.f;
// }
drvInternal->setUniform2f(IDriver::VertexProgram, 10, (decalR/(float)_BlurWidth)*blurVec.x, (decalR/(float)_BlurHeight)*blurVec.y); drvInternal->setUniform2f(IDriver::VertexProgram, 10, (decalR/(float)_BlurWidth)*blurVec.x, (decalR/(float)_BlurHeight)*blurVec.y);
drvInternal->setUniform2f(IDriver::VertexProgram, 11, (decal2R/(float)_BlurWidth)*blurVec.x, (decal2R/(float)_BlurHeight)*blurVec.y); drvInternal->setUniform2f(IDriver::VertexProgram, 11, (decal2R/(float)_BlurWidth)*blurVec.x, (decal2R/(float)_BlurHeight)*blurVec.y);
drvInternal->setUniform2f(IDriver::VertexProgram, 12, (decalL/(float)_BlurWidth)*blurVec.x, (decalL/(float)_BlurHeight)*blurVec.y); drvInternal->setUniform2f(IDriver::VertexProgram, 12, (decalL/(float)_BlurWidth)*blurVec.x, (decalL/(float)_BlurHeight)*blurVec.y);

View file

@ -32,7 +32,7 @@ namespace NL3D
{ {
// *************************************************************************** // ***************************************************************************
const uint32 IDriver::InterfaceVersion = 0x6d; // gpu program interface const uint32 IDriver::InterfaceVersion = 0x6e; // gpu program interface
// *************************************************************************** // ***************************************************************************
IDriver::IDriver() : _SyncTexDrvInfos( "IDriver::_SyncTexDrvInfos" ) IDriver::IDriver() : _SyncTexDrvInfos( "IDriver::_SyncTexDrvInfos" )

View file

@ -944,6 +944,7 @@ public:
virtual ITexture *getRenderTarget() const; virtual ITexture *getRenderTarget() const;
virtual bool copyTargetToTexture (ITexture *tex, uint32 offsetx, uint32 offsety, uint32 x, uint32 y, uint32 width, virtual bool copyTargetToTexture (ITexture *tex, uint32 offsetx, uint32 offsety, uint32 x, uint32 y, uint32 width,
uint32 height, uint32 mipmapLevel); uint32 height, uint32 mipmapLevel);
virtual bool textureCoordinateAlternativeMode() const { return true; };
virtual bool getRenderTargetSize (uint32 &width, uint32 &height); virtual bool getRenderTargetSize (uint32 &width, uint32 &height);
virtual bool fillBuffer (CBitmap &bitmap); virtual bool fillBuffer (CBitmap &bitmap);

View file

@ -572,6 +572,8 @@ public:
virtual bool copyTargetToTexture (ITexture *tex, uint32 offsetx, uint32 offsety, uint32 x, uint32 y, virtual bool copyTargetToTexture (ITexture *tex, uint32 offsetx, uint32 offsety, uint32 x, uint32 y,
uint32 width, uint32 height, uint32 mipmapLevel); uint32 width, uint32 height, uint32 mipmapLevel);
virtual bool textureCoordinateAlternativeMode() const { return false; };
virtual bool getRenderTargetSize (uint32 &width, uint32 &height); virtual bool getRenderTargetSize (uint32 &width, uint32 &height);