PDA

View Full Version : [GLSL]Transfer texture to fragment shader



GloWondub
04-01-2010, 08:49 AM
Hello

I'm now transferring texture to fragment shader.

But it's still not working.

here is my (test)shader :



#extension GL_ARB_texture_rectangle : enable

uniform sampler2DRect depthTex;

void main(void)
{
float depth=texture2DRect(depthTex,gl_FragCoord.xy).x;
gl_FragColor = gl_Color; // c'est aussi simple que cela
gl_FragDepth=float;
}


and here how i try to exchange data :


program = LoadProgram(NULL, "test.frag");
glUseProgram(program);
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D, txDepth);
depthTexLoc = glGetUniformLocation(program, "depthTex");
glBindTexture (GL_TEXTURE_2D, txDepth);
glUniform1i(depthTexLoc, 1);


some used fonctions :


#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#include <GL/glew.h> /* utilisation de glew ! */



#include "loadprogram.h"









int ExtensionSupportee(const char *nom)

{

#ifndef __glew_h__

const char *extensions = glGetString(GL_EXTENSIONS);

#endif



if(

#ifdef __glew_h__

glewIsSupported(nom)

#else

strstr(extensions, nom) != NULL

#endif

)

return 1;

else

{

fprintf(stderr, "extension %s non supportee\n", nom);

return 0;

}

}





int InitExtensions(void)

{

int state = 1;



if(!ExtensionSupportee("GL_ARB_shading_language_100") ||

!ExtensionSupportee("GL_ARB_shader_objects") ||

!ExtensionSupportee("GL_ARB_vertex_shader") ||

!ExtensionSupportee("GL_ARB_fragment_shader")

/* rajoutez ici les extensions que vous utiliserez */)

{

state = 0;

}



return state;

}







/* charge le code source d'un shader */

static char* LoadSource(const char *filename)

{

char *src = NULL; /* code source de notre shader */

FILE *fp = NULL; /* fichier */

long size; /* taille du fichier */

long i; /* compteur */





/* on ouvre le fichier */

fp = fopen(filename, "r");

/* on verifie si l'ouverture a echoue */

if(fp == NULL)

{

fprintf(stderr, "impossible d'ouvrir le fichier '%s'\n", filename);

return NULL;

}



/* on recupere la longueur du fichier */

fseek(fp, 0, SEEK_END);

size = ftell(fp);



/* on se replace au debut du fichier */

rewind(fp);



/* on alloue de la memoire pour y placer notre code source */

src = malloc(size+1); /* +1 pour le caractere de fin de chaine '\0' */

if(src == NULL)

{

fclose(fp);

fprintf(stderr, "erreur d'allocation de memoire!\n");

return NULL;

}



/* lecture du fichier */

for(i=0; i<size; i++)

src[i] = fgetc(fp);



/* on place le dernier caractere a '\0' */

src[size] = '\0';



fclose(fp);



return src;

}





GLuint LoadProgram(const char *vsname, const char *psname)

{

GLuint prog = 0;

GLuint vs = 0, ps = 0;

GLint link_status = GL_TRUE;

GLint logsize = 0;

char *log = NULL;





/* verification des arguments */

if(vsname == NULL && psname == NULL)

{

fprintf(stderr, "creation d'un program demande, mais aucuns "

"noms de fichiers source envoye, arret.\n");



return 0;

}





/* chargement des shaders */

if(vsname != NULL)

{

vs = LoadShader(GL_VERTEX_SHADER, vsname);

if(vs == 0)

return 0;

}

if(psname != NULL)

{

ps = LoadShader(GL_FRAGMENT_SHADER, psname);

if(ps == 0)

{

if(glIsShader(vs))

glDeleteShader(vs);

return 0;

}

}





/* creation du program */

prog = glCreateProgram();



/* on envoie nos shaders a notre program */

if(vs)

glAttachShader(prog, vs);

if(ps)

glAttachShader(prog, ps);



/* on lie le tout */

glLinkProgram(prog);



/* on verifie que tout s'est bien passe */

glGetProgramiv(prog, GL_LINK_STATUS, &link_status);

if(link_status != GL_TRUE)

{

glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logsize);

log = malloc(logsize + 1);

if(log == NULL)

{

glDeleteProgram(prog);

glDeleteShader(vs);

glDeleteShader(ps);



fprintf(stderr, "impossible d'allouer de la memoire!\n");

return 0;

}

memset(log, '\0', logsize + 1);

glGetProgramInfoLog(prog, logsize, &logsize, log);



fprintf(stderr, "impossible de lier le program :\n%s", log);



free(log);

glDeleteProgram(prog);

glDeleteShader(vs);

glDeleteShader(ps);



return 0;

}



/* les shaders sont dans le program maintenant, on en a plus besoin */

glDeleteShader(vs);

glDeleteShader(ps);



return prog;

}





GLuint LoadShader(GLenum type, const char *filename)

{

GLuint shader = 0;

GLsizei logsize = 0;

GLint compile_status = GL_TRUE;

char *log = NULL;

char *src = NULL;



/* creation d'un shader de sommet */

shader = glCreateShader(type);

if(shader == 0)

{

fprintf(stderr, "impossible de creer le shader\n");

return 0;

}



/* chargement du code source */

src = LoadSource(filename);

if(src == NULL)

{

/* theoriquement, la fonction LoadSource a deja affiche un message

d'erreur, nous nous contenterons de supprimer notre shader

et de retourner 0 */



glDeleteShader(shader);

return 0;

}



/* assignation du code source */

glShaderSource(shader, 1, (const GLchar**)&src, NULL);





/* compilation du shader */

glCompileShader(shader);



/* liberation de la memoire du code source */

free(src);

src = NULL;



/* verification du succes de la compilation */

glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);

if(compile_status != GL_TRUE)

{

/* erreur a la compilation recuperation du log d'erreur */



/* on recupere la taille du message d'erreur */

glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logsize);



/* on alloue un esapce memoire dans lequel OpenGL ecrira le message */

log = malloc(logsize + 1);

if(log == NULL)

{

fprintf(stderr, "impossible d'allouer de la memoire!\n");

return 0;

}

/* initialisation du contenu */

memset(log, '\0', logsize + 1);



glGetShaderInfoLog(shader, logsize, &logsize, log);

fprintf(stderr, "impossible de compiler le shader '%s' :\n%s",

filename, log);



/* ne pas oublier de liberer la memoire et notre shader */

free(log);

glDeleteShader(shader);



return 0;

}



return shader;

}



but i always get 0 values.

so i try this :



#extension GL_ARB_texture_rectangle : enable

uniform float alpha;
void main(void)
{

gl_FragColor = gl_Color; // c'est aussi simple que cela
gl_FragDepth=alpha;
}



with this :


program = LoadProgram(NULL, "test.frag");
glUseProgram(program);
lphaParam = glGetUniformLocation(program, "alpha");
glUniform1i(alphaParam, 0.666);



still give me 0.

any idea?

pjcozzi
04-01-2010, 08:56 AM
Since you are using sampler2DRect, instead of sampler2D, your call to glBindTexture should target GL_TEXTURE_RECTANGLE instead of GL_TEXTURE_2D. Also, make sure your texture coordinates are in the range [0, w] and [0, h], where w and h are the width and height of the texture, respectfully.

Regards,
Patrick

Bruce Wheaton
04-01-2010, 09:43 AM
And also your shader doesn't look right.

You're sampling the texture, and using it to make a float 'depth' variable, but you don't then use that to set any outputs. You set the fragment color to the incoming color, and I can't tell what you're setting the depth too - surprised that isn't a syntax error. Does your shader even compile?

Bruce

GloWondub
04-02-2010, 09:17 AM
@pjcozzi : right thx a lot for that.
@bruce : that's just a transcription error.

ok, i try other different way to transfer data.

i succed to transfer float like this :



uniform float alpha;
void main(void)
{

gl_FragColor = gl_Color; // c'est aussi simple que cela
gl_FragDepth=alpha;
}

with this part of code before rendering:


glUseProgram(program);
glUniform1f(glGetUniformLocation(program,"alpha"),0.666);



but in any way i cannot passed Texture data :


uniform sampler2D depthTex;
varying float depth;
void main(void)
{
depth=texture(depthTex,vec2(0,0)[0]);
gl_FragColor = gl_Color; // c'est aussi simple que cela
if(gl_FragCoord.z<=depth)
gl_FragDepth=0.99;
}




glUseProgram(program);
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D, txDepth[(j+1)%2]);
depthTexLoc = glGetUniformLocation(program, "depthTex");
glBindTexture (GL_TEXTURE_2D, txDepth[(j+1)%2]);
glUniform1i(depthTexLoc, 1);


i ALWAYS have the value 1.0000 in depth.

pjcozzi
04-02-2010, 09:26 AM
This line is suspect:



depth=texture(depthTex,vec2(0,0)[0]);

The second argument is the texture coordinate used to read the texture. vec2(0, 0) is the bottom left of the texture. [0] is the x component (0). I'm actually surprised it compiles. I assume the scalar 0 is getting converted back to vec2(0, 0). Regardless, you are getting the same value out of the texture because you are always reading from the same location.

Regards,
Patrick

Alfonse Reinheart
04-02-2010, 09:59 AM
There's also the fact that "depth" is a varying. You can't set varyings in a fragment shader (which is one reason why the explicit in/out distinction in 1.3 and above is so nice).

GloWondub
04-02-2010, 10:04 AM
ok i correct it.

before there is no error in compilation.

so i try this :


uniform sampler2D depthTex;

varying float depth;
void main(void)
{
depth=texture(depthTex,vec2(0,0))[0];
gl_FragColor = gl_Color; // c'est aussi simple que cela
if(gl_FragCoord.z<=depth)//(depth+bias))
gl_FragDepth=0.99;
}


and this



uniform sampler2D depthTex;
varying float depth;
void main(void)
{
depth=texture(depthTex,gl_FragCoord.xy)[0];
gl_FragColor = gl_Color; // c'est aussi simple que cela
if(gl_FragCoord.z<=depth)
gl_FragDepth=0.99;

}


without any change in results or any errors

I'm currently searching example of code where a texture is transfered and try to compile and execute it.