Sign in to follow this  
hayden

OpenGL OpenGL / GLSL problem and question

Recommended Posts

Hi, i'm trying to implement depth of field through GLSL (Zhou et al. technique) but i am a total noob at this shading language. I have two textures in the fragment shader, textures of scene rendering and depth map: uniform sampler2D ColorMap; uniform sampler2DShadow DepthMap; The technique is a sort of separable Gaussian filter, 2 pass, one horizontal and one vertical. I'm just testing the first pass (horizontal), and the problem comes when an object is touching the texture borders, it's color scatters by all that line and the result is a line/bar of that color. For each center pixel i'm adding sample pixel colors and it's contribution, with sample pixels being left/right of center pixel. But it seems to me that when i give a new color to center pixel with gl_FragColor = newCenterPixColor; this new color of the last pixel will affect the original texture 'ColorMap' i had as input, and other center pixel will have samples with new colors and not original colors like i wanted. Is this assumption correct? If so, how do i maintain a texture of the frame buffer, as input of fragment shader, without any kind of change when affecting pixel color with gl_FragColor? Thanks to anyone that helps me with this :)

Share this post


Link to post
Share on other sites
Sorry, because i don't dominate the shading language in a expert level i don't know how to make my doubt well explained.

These are 3 screen-shots of what's happening:
http://img247.imageshack.us/my.php?image=ss01rs8.jpg
http://img393.imageshack.us/my.php?image=ss02gv3.jpg
http://img393.imageshack.us/my.php?image=ss03se7.jpg

And next i give you the shaders code:

// ------- Vertex Shader -----------
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}

// ------- Fragment Shader -----------
uniform float Near, Far, FocalLength, ZFocus;
uniform sampler2D ColorMap;
uniform sampler2DShadow DepthMap;

void main (void)
{
int i;
float overlapW, intensityW, leakageW, finalW;
vec4 samplePixColor;
vec4 sampleCoord;

vec2 xOffset[16];
xOffset[0] = vec2(-8,0);
xOffset[1] = vec2(-7,0);
xOffset[2] = vec2(-6,0);
xOffset[3] = vec2(-5,0);
xOffset[4] = vec2(-4,0);
xOffset[5] = vec2(-3,0);
xOffset[6] = vec2(-2,0);
xOffset[7] = vec2(-1,0);
xOffset[8] = vec2(1,0);
xOffset[9] = vec2(2,0);
xOffset[10] = vec2(3,0);
xOffset[11] = vec2(4,0);
xOffset[12] = vec2(5,0);
xOffset[13] = vec2(6,0);
xOffset[14] = vec2(7,0);
xOffset[15] = vec2(8,0);

float centerPixDepth = DepthConvertion(shadow2DProj(DepthMap, gl_TexCoord[0]).x);

vec4 centerPixColor = texture2D(ColorMap, gl_TexCoord[0].xy);

/*** code removed from here **/


for(i=0; i<16; i++){
sampleCoord = gl_TexCoord[0] + vec4(xOffset[i].x, xOffset[i].y, 0.0, 0.0);
samplePixDepth = DepthConvertion(shadow2DProj(DepthMap, sampleCoord).x);

/*** code removed from here ***/

samplePixColor = texture2D(ColorMap, sampleCoord .xy);

overlapW = //...
intensityW = //...
leakageW = //...

finalW = overlapW * intensityW * leakageW;
centerPixColor += (samplePixColor * finalW);
}

centerPixColor = clamp(centerPixColor, 0.0, 1.0);
gl_FragColor = centerPixColor;
}


// ------- OpenGL texture settings -----------

glGenTextures(2, textures);

//Setup color texture
glBindTexture(GL_TEXTURE_2D, textures[COLOR_MAP]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIN_WIDTH, WIN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

//Setup depth texture
glBindTexture(GL_TEXTURE_2D, textures[DEPTH_MAP]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, WIN_WIDTH, WIN_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// ------- OpenGL copying frame buffer to texture -----------
glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,0,0,WIN_WIDTH,WIN_HEIGHT,0);

// ------- OpenGL copying depth buffer to texture -----------
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, WIN_WIDTH,WIN_HEIGHT, 0);



Hope it can help... Thank you for your time!

Share this post


Link to post
Share on other sites
Your gl_TexCoord[0] contains coords with range 0.0 to 1.0

You are adding/subtracting integer offsets when you do this:

sampleCoord = gl_TexCoord[0] + vec4(xOffset[i].x, xOffset[i].y, 0.0, 0.0);

You need to scale the offsets so they are also in the correct range, so if the texture is 256x256 for example:

xOffset[i].x = xOffset[i].x / 256.0;

I remember having problems on some cards with CLAMP_TO_EDGE. You may need to do this:

sampleCoord.x = clamp(sampleCoord.x, 0.0, 1.0);

(for both x & y)

HTH

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this