opengles2.0 normal map shader

Post those lines of code you feel like sharing or find what you require for your project here; or simply use them as tutorials.
Post Reply
tscmga
Posts: 2
Joined: Wed May 29, 2013 9:32 am

opengles2.0 normal map shader

Post by tscmga »

The irrlicht openges2.0 dosen't support all the build-in materials now . I share this code for someone to have a preview of the normal map texture . I also changed the shader input type from vec4 to vec3 , but it may be not necessary .

Code: Select all

 
bool COGLES2NormalMapRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype)
{
    if (SharedRenderer)
        return SharedRenderer->OnRender(service, vtxtype);
    else
    {
        /* Vertex Shader part */
        /* Transform Matrices Upload */
        
        
        core::matrix4 world = Driver->getTransform(ETS_WORLD);
        IMaterialRendererServices::setVertexShaderConstant("uWorldMatrix", world.pointer(), 16);
        
        core::matrix4 worldViewProj = Driver->getTransform(video::ETS_PROJECTION);
        worldViewProj *= Driver->getTransform(video::ETS_VIEW);
        worldViewProj *= Driver->getTransform(ETS_WORLD);
        IMaterialRendererServices::setVertexShaderConstant("uMvpMatrix", worldViewProj.pointer(), 16);
         
        
       // IMaterialRendererServices* services=service;
        
        video::IVideoDriver* driver = Driver;//services->getVideoDriver();
        
        
        /*
        
        // set transposed world matrix
        const core::matrix4& tWorld = driver->getTransform(video::ETS_WORLD).getTransposed();
        //services->setVertexShaderConstant(tWorld.pointer(), 0, 4);
       
        // set transposed worldViewProj matrix
        core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION));
        worldViewProj *= driver->getTransform(video::ETS_VIEW);
        worldViewProj *= driver->getTransform(video::ETS_WORLD);
        core::matrix4 tr(worldViewProj.getTransposed());
        services->setVertexShaderConstant(tr.pointer(), 8, 4);
         */
        
        
        // here we fetch the fixed function lights from the driver
        // and set them as constants
        
        u32 cnt = driver->getDynamicLightCount();
        
        // Load the inverse world matrix.
        core::matrix4 invWorldMat;
        driver->getTransform(video::ETS_WORLD).getInverse(invWorldMat);
        
        core::vector3df vpos[2];
        video::SColorf vcolor[2];
        
        for (u32 i=0; i<2; ++i)
        {
            video::SLight light;
            
            if (i<cnt)
                light = driver->getDynamicLight(i);
            else
            {
                light.DiffuseColor.set(0,0,0); // make light dark
                light.Radius = 1.0f;
            }
            
            light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation
            
            // Transform the light by the inverse world matrix to get it into object space.
            invWorldMat.transformVect(light.Position);
            
            /*services->setVertexShaderConstant(
                                              reinterpret_cast<const f32*>(&light.Position), 12+(i*2), 1);*/
            vpos[i]=light.Position;
            vcolor[i]=light.DiffuseColor;
                                                               
            
            /*
            services->setVertexShaderConstant(
                                              reinterpret_cast<const f32*>(&light.DiffuseColor), 13+(i*2), 1);*/
     
            
        }
        IMaterialRendererServices::setVertexShaderConstant("uLightPos[0]",reinterpret_cast<const f32*>(&vpos),6);
        IMaterialRendererServices::setVertexShaderConstant("uLightColor[0]",reinterpret_cast<const f32*>(&vcolor),8);
        
        /* Textures Upload */
        
        s32 TextureUsage0 = Driver->isActiveTexture(0);
        s32 TextureUsage1 = Driver->isActiveTexture(1);
        
        IMaterialRendererServices::setPixelShaderConstant("uTextureUsage0", &TextureUsage0, 1);
        IMaterialRendererServices::setPixelShaderConstant("uTextureUsage1", &TextureUsage1, 1);
        
        core::matrix4 textureMatrix0 = Driver->getTransform(video::ETS_TEXTURE_0);
        core::matrix4 textureMatrix1 = Driver->getTransform(video::ETS_TEXTURE_0);
        
        IMaterialRendererServices::setPixelShaderConstant("uTextureMatrix0", textureMatrix0.pointer(), 16);
        IMaterialRendererServices::setPixelShaderConstant("uTextureMatrix1", textureMatrix1.pointer(), 16);
        
        s32 TextureUnit0 = 0;
        s32 TextureUnit1 = 1;
        
        IMaterialRendererServices::setPixelShaderConstant("texture0", &TextureUnit0, 1);
        IMaterialRendererServices::setPixelShaderConstant("texture1", &TextureUnit1, 1);
 
        return true;
    }
 
Post Reply