GLSL - Invert Color fragment shader...

You are an experienced programmer and have a problem with the engine, shaders, or advanced effects? Here you'll get answers.
No questions about C++ programming or topics which are answered in the tutorials!
Post Reply
felipeprov
Posts: 1
Joined: Sun Aug 05, 2007 1:29 pm

GLSL - Invert Color fragment shader...

Post by felipeprov »

Hi, i 'm learning how do post processing.
I got sucess with blur, but i can't do a simple invert color with sucess... :(

That's the fragment shader (i omit the variable declarations) ...

Code: Select all

void main(void)
{
   vec4 color = texture2D(RT, vTexCoord.xy );
   
   gl_FragColor= vec4(1-color.r,1-color.g, 1-color.b,color.a) ; 
}
It's compile but have no effect... Apparentily the result is the same of:

Code: Select all

gl_FragColor= vec4(color.r,color.g, color.b,color.a) ; 
The strange is: If i change the code to, by example:

Code: Select all

gl_FragColor= vec4(2*color.r,3*color.g, 3*color.b,color.a) ; 
I got the right results...
Some hope?

PS: sorry my english
:oops:


vertice shader

Code: Select all

varying vec2 vTexCoord;

void main(void)
{
   vec2 Pos = sign(gl_Vertex.xy);

   gl_Position = vec4(Pos.xy, 0, 1);

   vTexCoord.x = 0.5 * (1.0 + Pos.x);
   vTexCoord.y = 0.5 * (1.0 + Pos.y);

}

main.cpp

Code: Select all


#include <irrlicht.h>

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


int main(int argc, char** argv)
{

    IrrlichtDevice *device =
        createDevice(video::EDT_OPENGL, dimension2d<s32>(640, 480), 32,
            false, false, false, 0);

    device->setWindowCaption(L"Post Processor Test");


    IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();

    video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
    s32 mtlPost = video::EMT_SOLID;

    if (gpu )
    {
        mtlPost = gpu->addHighLevelShaderMaterialFromFiles("../../media/post.vert", "main", video::EVST_VS_1_1,
                                                        "../../media/combine.frag", "main", video::EPST_PS_1_1,
                                                    NULL, video::EMT_TRANSPARENT_ALPHA_CHANNEL);
    }


    IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2");
    IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );

    if (node)
    {
        node->setMaterialFlag(EMF_LIGHTING, false);
        node->setMD2Animation(scene::EMAT_STAND);
        node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") );
        //node->setMaterialType( (video::E_MATERIAL_TYPE)mtlToonShader);
    }

    smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

    ISceneNode* postProcessorNode = smgr->addCubeSceneNode(60.0);
    ITexture* rt = driver->createRenderTargetTexture(dimension2d<s32>(512,512));

    while(device->run())
    {

        driver->beginScene(true, true, 0);

        driver->setRenderTarget(rt, true, true, video::SColor(255,100,101,140));
        smgr->drawAll();

        driver->setRenderTarget(0);

        postProcessorNode->setVisible(true);
        postProcessorNode->setMaterialTexture(0, rt);

        postProcessorNode->setMaterialType((video::E_MATERIAL_TYPE) mtlPost);
        postProcessorNode->render();

        driver->endScene();
    }
    device->drop();

    return 0;
}

PJjerry
Posts: 28
Joined: Mon Oct 24, 2005 6:57 pm

Post by PJjerry »

try

void main(void)
{
vec4 color = texture2D(RT, vTexCoord.xy );
gl_FragColor= vec4( 1.0 - color.r, 1.0 - color.g, 1.0 - color.b, color.a );
}
Post Reply