Jump to content

  • Log In with Google      Sign In   
  • Create Account

Blend mode for signed color addition.


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 anindie   Members   -  Reputation: 101

Like
0Likes
Like

Posted 23 April 2012 - 01:23 AM

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

Sponsor:

#2 dpadam450   Members   -  Reputation: 928

Like
0Likes
Like

Posted 23 April 2012 - 05:12 PM

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.

#3 anindie   Members   -  Reputation: 101

Like
0Likes
Like

Posted 24 April 2012 - 10:06 PM

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..

#4 dpadam450   Members   -  Reputation: 928

Like
0Likes
Like

Posted 24 April 2012 - 11:32 PM

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.

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

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.

#5 anindie   Members   -  Reputation: 101

Like
0Likes
Like

Posted 08 May 2012 - 01:51 AM

OK. I gave up bumpmaping. Cause I am trying to do all these calculation in real time, on a iphone. Posted Image 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;
    
}




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS