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 10 of 10

Thread: Shader doesnt work

  1. #1
    Junior Member Newbie
    Join Date
    Jun 2010
    Posts
    12

    Shader doesnt work

    Hi, i want this shader to get working on my desktop PC but had no success.
    #ifdef GL_ES
    precision highp float;
    #endif

    uniform vec2 resolution;
    uniform float time;

    void main(void)
    {
    vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
    float a = time*40.0;
    float d,e,f,g=1.0/40.0,h,i,r,q;
    e=400.0*(p.x*0.5+0.5);
    f=400.0*(p.y*0.5+0.5);
    i=200.0+sin(e*g+a/150.0)*20.0;
    d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
    r=sqrt(pow(i-e,2.0)+pow(d-f,2.0));
    q=f/r;
    e=(r*cos(q))-a/2.0;f=(r*sin(q))-a/2.0;
    d=sin(e*g)*176.0+sin(e*g)*164.0+r;
    h=((f+d)+a/2.0)*g;
    i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
    h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
    h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
    i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
    i=mod(i/5.6,256.0)/64.0;
    if(i<0.0) i+=4.0;
    if(i>=2.0) i=4.0-i;
    d=r/350.0;
    d+=sin(d*d*8.0)*0.52;
    f=(sin(a*g)+1.0)/2.0;
    gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),1.0);
    }
    For my shader class i need an vertex- and fragment shader. so i used this vertexshader:
    void main(void)
    {
    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    }
    The function for rendering is like
    void Draw(Point topLeft, Point bottomRight)
    {
    counter += 0.01;
    if (counter > 360.0)
    counter = 0;

    int x = bottomRight.X() - topLeft.X();
    int y = bottomRight.Y() - topLeft.Y();

    glDisable(GL_CULL_FACE);

    glColor4ub(rand()%255, rand()%255, rand()%255, 255);

    shader.bind();
    glUniform2d(shader_resolution, x, y);
    glUniform1d(shaderr_time, counter);

    glBegin(GL_TRIANGLES);
    glVertex3d(topLeft.X(), topLeft.Y(), -10.0);
    glVertex3d(topLeft.X(), bottomRight.Y(), -10.0);
    glVertex3d(bottomRight.X(), topLeft.Y(), -10.0);

    glVertex3d(topLeft.X(), bottomRight.Y(), -10.0);
    glVertex3d(bottomRight.X(), bottomRight.Y(), -10.0);
    glVertex3d(bottomRight.X(), topLeft.Y(), -10.0);
    glEnd();

    shader.unbind();
    glEnable(GL_CULL_FACE);
    }
    Any idea why this gives me an black rectangle?

  2. #2
    Senior Member OpenGL Guru
    Join Date
    May 2009
    Posts
    4,793

    Re: Shader doesnt work

    Possibly because it uses the worst, least intuitive variables names known to man.

    Any guesses on what the shader is supposed to do? Have you confirmed that the triangle is on screen (by writing a solid color in the fragment shader)?

  3. #3
    Senior Member OpenGL Pro BionicBytes's Avatar
    Join Date
    Mar 2009
    Location
    UK, London
    Posts
    1,171

    Re: Shader doesnt work

    Why are you sending doubles as uniforms:
    Code :
    glUniform2d(shader_resolution, x, y);
    glUniform1d(shaderr_time, counter);
    when your shaders define them as floats?
    Code :
    uniform vec2 resolution;
    uniform float time;

  4. #4
    Junior Member Newbie
    Join Date
    Jun 2010
    Posts
    12

    Re: Shader doesnt work

    Quote Originally Posted by Alfonse Reinheart
    Any guesses on what the shader is supposed to do? Have you confirmed that the triangle is on screen (by writing a solid color in the fragment shader)?
    The result should look like this.

    If i change the fragment shader to the following i get as supposed an filled rectangle.
    void main(void)
    {
    gl_FragColor = gl_Color;
    }

  5. #5
    Junior Member Newbie
    Join Date
    Sep 2011
    Posts
    17

    Re: Shader doesnt work

    My guess is that you are not passing the uniforms correctly:
    http://www.opengl.org/wiki/GLSL_:_common_mistakes

  6. #6
    Advanced Member Frequent Contributor
    Join Date
    Mar 2009
    Location
    Singapore
    Posts
    802

    Re: Shader doesnt work

    I agree to what BionicBytes says here. Pass the uniforms as floats like this,
    Code :
    glUniform2f(shader_resolution, x, y);
    glUniform1f(shaderr_time, counter);
    Regards,
    Mobeen

  7. #7
    Advanced Member Frequent Contributor
    Join Date
    Jan 2007
    Posts
    982

    Re: Shader doesnt work

    void main(void)
    {
    vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;
    float a = time*40.0;
    float d,e,f,g=1.0/40.0,h,i,r,q;
    e=400.0*(p.x*0.5+0.5);
    f=400.0*(p.y*0.5+0.5);
    i=200.0+sin(e*g+a/150.0)*20.0;
    d=200.0+cos(f*g/2.0)*18.0+cos(e*g)*7.0;
    r=sqrt(pow(i-e,2.0)+pow(d-f,2.0));
    q=f/r;
    e=(r*cos(q))-a/2.0;f=(r*sin(q))-a/2.0;
    d=sin(e*g)*176.0+sin(e*g)*164.0+r;
    h=((f+d)+a/2.0)*g;
    i=cos(h+r*p.x/1.3)*(e+e+a)+cos(q*g*6.0)*(r+h/3.0);
    h=sin(f*g)*144.0-sin(e*g)*212.0*p.x;
    h=(h+(f-e)*q+sin(r-(a+h)/7.0)*10.0+i/4.0)*g;
    i+=cos(h*2.3*sin(a/350.0-q))*184.0*sin(q-(r*4.3+a/12.0)*g)+tan(r*g+h)*184.0*cos(r*g+h);
    i=mod(i/5.6,256.0)/64.0;
    if(i<0.0) i+=4.0;
    if(i>=2.0) i=4.0-i;
    d=r/350.0;
    d+=sin(d*d*8.0)*0.52;
    f=(sin(a*g)+1.0)/2.0;
    gl_FragColor=vec4(vec3(f*i/1.6,i/2.0+d/13.0,i)*d*p.x+vec3(i/1.3+d/8.0,i/2.0+d/18.0,i)*d*(1.0-p.x),1.0);
    }
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    My guess is that you've blown well past your instruction limit and are now sailing out merrily somewhere in the region of the Small Magellanic Cloud.

    What kind of hardware are you trying to run this monstrosity on?

  8. #8
    Advanced Member Frequent Contributor arekkusu's Avatar
    Join Date
    Nov 2003
    Posts
    676

    Re: Shader doesnt work

    GLSL does not have an instruction limit:

    "A shader should not fail to compile, and a program object should not fail to link due to lack of instruction space or lack of temporary variables. Implementations should ensure that all valid shaders and program objects may be successfully compiled, linked and executed."

  9. #9
    Senior Member OpenGL Guru
    Join Date
    May 2009
    Posts
    4,793

    Re: Shader doesnt work

    Yeah, like any implementation has ever allowed that. Please; that's one of the Ivory Tower ideals that 3D Labs put into the original GLSL proposal. And like virtually all of those ideals, it amounted to nothing.

    Shaders can and will fail to compile/link due to lack of instructions or temporaries.

  10. #10
    Member Regular Contributor
    Join Date
    May 2001
    Posts
    349

    Re: Shader doesnt work

    Quote Originally Posted by mhagain
    My guess is that you've blown well past your instruction limit and are now sailing out merrily somewhere in the region of the Small Magellanic Cloud.
    That shader is horrible to read, but I don't think it's anywhere close to instruction or temp limits on any modern PC GPU. It will even "run" on many smartphones.

Posting Permissions

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