Blend mode for signed color addition.

Started by
3 comments, last by anindie 12 years ago
Hi,
I am trying to generate and merge normal map in runtime. I stuck upon adding rgb pixels of normal map.

Since opengl stores texture values in unsigned int format. I need to add texels signed.   glBlendFunc(GL_ONE, GL_ONE). Doesnot help

Exact combining is required is ((R1-127)+(R2-127))+127   How can I acomplish this. (Using blendequations)
Thanks
Advertisement
Your equation is number + number + offset. That is addative not merge. I'm confused as to what you are doing, if you want to blend two normal maps and then use it for a normal map you need a shader. glBlendFunc only blends things that go to the screen.

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal

Ok. let me explain.  I started with programmaticality generating height map of my scene. Its straight forward. I am rendering small height sprites to the fbo. glBlendFunc(GL_ONE, GL_ONE).  With additive function I get fairly nice heightmap.  In order to use these heightmap. I am converting  it to normalmap. programmability using a shader.

color.r=dFdx(color.r)
color.g=dFdy(color.g);


But this operation is hell of expensive and normal where not smooth. Now I want eliminate the hieghtmap and directly trying to generate normal map. (Using normal sprite?). However It seems that normals does not add up. Feels like I should drop the idea..
But this operation is hell of expensive and normal where not smooth. Now I want eliminate the hieghtmap and directly trying to generate normal map.[/quote]
If this is for a tool like a terrain editor, it doesn't need to be very fast, even though if you generate the normal map every frame, you should still be fairly good. When blending are you drawing every single paint stroke or do you keep the old copy and just apply 1 stroke each frame to the previous combined image.

But this operation is hell of expensive and normal where not smooth. Now I want eliminate the hieghtmap and directly trying to generate normal map[/quote]
You want to sample the surrounding 8 pixels and current pixel, average them by dividing by 9 to smooth the normals. The two lines you posted are not what you want to generate a smooth normal map from a height map.
pixel_x_step = 1.0/TextureWidth;
PixelLeft = texture2D(x - pixel_x_step, y); //sample the pixel to the left of the current pixel
//repeat for all other 8 neighbors

As for getting rid of the heightmap, that doesn't even make sense, how will you know how high to shift your terrain verts. Normals are directions (-1 to 1) or (0 to 1), not displacements (0 to MAX_HEIGHT) for instance terrain might have a height of 10,000 if its a tall mountain.

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal

OK. I gave up bumpmaping. Cause I am trying to do all these calculation in real time, on a iphone. smile.png Not going to happan. Thanks for all.  

I am writing bit of my shader code, for those who are interested. I hope its correct :?). It seems to working; but as I said before generated normalmap is not smooth.




    vec3 normal=  texture2D(heighttexture, gl_TexCoord[0].xy).xyz;
    
    normal.r=dFdx(normal.x)*50.0;
    normal.g=dFdy(normal.y)*50.0;
    normal.b=0.0;

    float z = abs(normal.r)+abs(normal.g);
    
    if( z > 1.0 )
    {
        normal.rg/=z;
    }

    float blue = 1.0-length(normal);

    normal=normal*0.5+0.5;

    normal.b= blue;




This is another code that I tried, generates smooth normals, it makes again expensive.



const float width=0.01;
const float strength=1.0;



vec3 nomralfrombump(sampler2D atex,vec2 textcoord)
{
        
    vec4 heretex = texture2D(atex, textcoord.xy);
    
    if(heretex.a == 0.0)
    return vec3(0.0,0.0,0.0);
    
    vec2 dus= vec2(textcoord.x+width, textcoord.y);

    vec2 dvs= vec2(textcoord.x, textcoord.y+width);
    vec4 du4 = heretex  - texture2D(atex,dus);
    vec4 dv4 = heretex - texture2D(atex,dvs);
    
    du4.x=du4.x*strength;
    dv4.x=dv4.x*strength;
    
    float z = abs(du4.x)+abs(dv4.x);
    
    if( z > 1.0 )
    {
        du4.r/=z;
        dv4.r/=z;
    }
    
    float dw = sqrt(1.0-du4.r*du4.r - dv4.r*dv4.r);
    
    vec3 normal=vec3(du4.x*0.5+0.5,dv4.x*0.5+0.5,dw);
    
    return normal;
    
}

This topic is closed to new replies.

Advertisement