• Advertisement
Sign in to follow this  

glsl projective shader

This topic is 4481 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Im trying to use projective texturing with glsl but I have a problem. Here is the screenshot screenshot As you can see there are black parts in the water they are over the edges of the water mesh. I draw the water with vertex arrays and use triangle strips. Here are the shaders. //Vertex shader varying vec4 ProjTexCoord; void main() { mat4 MR; gl_Position = ftransform(); gl_TexCoord[0] = gl_MultiTexCoord0; MR=mat4(0.5,0.0,0.0,0.0, 0.0,0.5,0.0,0.0, 0.0,0.0,0.5,0.0, 0.5,0.5,0.5,1.0); ProjTexCoord=(MR*gl_ModelViewProjectionMatrix)*gl_Vertex; } //fragment shader uniform sampler2D tex0; uniform sampler2D tex1; varying vec4 ProjTexCoord; void main() { vec4 color; vec4 colProj; color = texture2D(tex0, gl_TexCoord[0].xy); colProj = texture2DProj(tex1, ProjTexCoord); color = color * colProj; gl_FragColor = color; }

Share this post


Link to post
Share on other sites
Advertisement
When i put the reflection texture into texture unit 0 it works but if its in the 1.st unit it doesnt O_O.
I dont know why that happens.

Share this post


Link to post
Share on other sites
This is how i draw the water surface.
The RTT texture is in unit 0 and it works this way.

glPushAttrib(GL_ENABLE_BIT);
glVertexPointer(3,GL_FLOAT,0,m_pVertices);

//glClientActiveTextureARB(GL_TEXTURE0_ARB);
//glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glTexCoordPointer(2,GL_FLOAT,0,m_pTexCoords);

glClientActiveTextureARB(GL_TEXTURE1_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,m_pTexCoords);
//glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);

//If we are over the water surface draw the water with projective texturing
if(pCamera->getPosition().y>m_vPosition.y){

if(m_bDrawReflection){
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
}
glDisable(GL_LIGHTING);

glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D,m_iTextureName[(int)m_fCurrentTexture]);

if(m_bDrawReflection){
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_iRTextureName);
}

GLfloat remapMatrix[] = {0.5,0.0,0.0,0.0,
0.0,0.5,0.0,0.0,
0.0,0.0,0.5,0.0,
0.5,0.5,0.5,1.0};

glActiveTextureARB(GL_TEXTURE0_ARB);
float Mproj[16],Mview[16];
glGetFloatv(GL_MODELVIEW_MATRIX,Mview);
glGetFloatv(GL_PROJECTION_MATRIX,Mproj);
glMatrixMode(GL_TEXTURE);
{
glLoadMatrixf(remapMatrix);
glMultMatrixf(Mproj);
glMultMatrixf(Mview);
}
glMatrixMode(GL_MODELVIEW);

int count = m_iSize<<1;
for(int i=0;i<m_iSize-1;i++)
glDrawElements(GL_TRIANGLE_STRIP,count,GL_UNSIGNED_INT,&m_pIndices[(i*(m_iSize))<<1]);

glMatrixMode(GL_TEXTURE);
glLoadIdentity();

glMatrixMode(GL_MODELVIEW);
glActiveTextureARB(GL_TEXTURE0_ARB);


I active the shader before i draw the water :

m_PerPixel.use(ST_TRUE);
//set shader tex
m_PerPixel.setInt(m_PerPixel.getVariable("tex0"),1);
m_PerPixel.setInt(m_PerPixel.getVariable("tex1"),0);
if(m_pWater)
//m_pWater->draw(pCamera);
m_pWater->drawShaders(pCamera);
m_PerPixel.use(ST_FALSE);


drawShaders is the function above.

And these are the working shaders

varying vec4 ProjTexCoord;
void main()
{
gl_Position = ftransform();
gl_TexCoord[1] = gl_MultiTexCoord1;
ProjTexCoord = gl_TextureMatrix[0] * gl_Vertex;
gl_FrontColor = vec4(1.0,1.0,1.0,1.0);
}


uniform sampler2D tex0;
uniform sampler2D tex1;
varying vec4 ProjTexCoord;
const vec4 ambient = vec4(0.13), boost = vec4(1.06);
void main()
{
vec4 color = texture2D(tex0, gl_TexCoord[1].st);
vec4 reflectionValue = texture2DProj(tex1, ProjTexCoord);


gl_FragColor = boost * color * reflectionValue + ambient;

}


But if I change the reflection from texture unit 0 to 1 and do all changes.I get the Image in screenshot.Black lines over the water surface other than that everything looks normal

[Edited by - phantom on November 6, 2005 7:34:10 PM]

Share this post


Link to post
Share on other sites
Thnx for the formatting :P
Hmmm does calling texture2d() affect the other texture2dProj() in the fragment shader??I guess it shouldn't but yesterday when I commented it out the output was different.Maybe it was just my dead eyes I dunno...

Share this post


Link to post
Share on other sites
Ok not it works in texture unit 1 too but I had to remove my varying variable for that and use the gl_TexCoord[1] like this


varying vec4 ProjTexCoord;
void main()
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_TextureMatrix[1] * gl_Vertex;
//ProjTexCoord = gl_TextureMatrix[1] * gl_Vertex;;


gl_FrontColor = vec4(1.0,1.0,1.0,1.0);
}

uniform sampler2D base;
uniform sampler2D reflection;
varying vec4 ProjTexCoord;
const vec4 ambient = vec4(0.13), boost = vec4(1.06);
void main()
{
vec4 color = vec4(texture2D(base, gl_TexCoord[0].st));
vec4 reflectionValue = vec4(texture2DProj(reflection, gl_TexCoord[1]));

gl_FragColor = boost * reflectionValue + ambient;

}




Instead of gl_TexCoord[1] if I use ProjTexCoord it has those black artifacts in the screen shot O_O

Share this post


Link to post
Share on other sites
Hi Again :|
I want to disturb the reflections in the fragment shader by using another texture.
Here are the shaders :

varying vec4 ProjTexCoord;
void main()
{
gl_Position = ftransform();

gl_TexCoord[1] = gl_TextureMatrix[1] * gl_Vertex;
ProjTexCoord = gl_TextureMatrix[1] * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;


gl_FrontColor = gl_Color;
}

varying vec4 ProjTexCoord;
uniform sampler2D base;
uniform sampler2D reflection;

const vec4 ambient = vec4(0.13), boost = vec4(1.06);
void main()
{
vec4 color = vec4(texture2D(base, gl_TexCoord[0].st));


vec4 dist = vec4(0.0,0.0,0.0,0.0);
dist.x = color.x * 20.0 + gl_TexCoord[1].s;
dist.y = gl_TexCoord[1].t;
dist.z = color.z * 20.0 +gl_TexCoord[1].r;
dist.w = gl_TexCoord[1].q;

//vec4 reflectionValue = vec4(texture2DProj(reflection, gl_TexCoord[1]));
vec4 reflectionValue = vec4(texture2DProj(reflection, dist));

gl_FragColor = boost * reflectionValue + ambient;

gl_FragColor.a = gl_Color.a;
}



And here is how it looks like :(
Screen Shot

If a remove the *20.0 then the black artifacts go away but the reflections is very calm.Im sure color is between 0.0-1.0.But if I add too much to dist.x the reflections get black artifacts.
Any help?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement