Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 7 of 7

Thread: [GLSL]Transfer texture to fragment shader

  1. #1
    Junior Member Newbie
    Join Date
    Apr 2010
    Posts
    9

    [GLSL]Transfer texture to fragment shader

    Hello

    I'm now transferring texture to fragment shader.

    But it's still not working.

    here is my (test)shader :

    Code :
    #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 :
    Code :
     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 :
    Code :
    #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 :

    Code :
    #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 :
    Code :
     program = LoadProgram(NULL, "test.frag");
    glUseProgram(program);
    lphaParam = glGetUniformLocation(program, "alpha");
       		glUniform1i(alphaParam, 0.666);

    still give me 0.

    any idea?

  2. #2
    Junior Member Regular Contributor pjcozzi's Avatar
    Join Date
    Jun 2004
    Location
    Philadelphia, PA
    Posts
    196

    Re: [GLSL]Transfer texture to fragment shader

    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

  3. #3
    Intern Contributor
    Join Date
    May 2008
    Location
    USA
    Posts
    96

    Re: [GLSL]Transfer texture to fragment shader

    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

  4. #4
    Junior Member Newbie
    Join Date
    Apr 2010
    Posts
    9

    Re: [GLSL]Transfer texture to fragment shader

    @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 :

    Code :
    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:
    Code :
    glUseProgram(program);
    glUniform1f(glGetUniformLocation(program,"alpha"),0.666);


    but in any way i cannot passed Texture data :
    Code :
    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;
    }

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




  5. #5
    Junior Member Regular Contributor pjcozzi's Avatar
    Join Date
    Jun 2004
    Location
    Philadelphia, PA
    Posts
    196

    Re: [GLSL]Transfer texture to fragment shader

    This line is suspect:

    Code :
    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

  6. #6
    Senior Member OpenGL Guru
    Join Date
    May 2009
    Posts
    4,726

    Re: [GLSL]Transfer texture to fragment shader

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

  7. #7
    Junior Member Newbie
    Join Date
    Apr 2010
    Posts
    9

    Re: [GLSL]Transfer texture to fragment shader

    ok i correct it.

    before there is no error in compilation.

    so i try this :
    Code :
    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

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


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •