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

Thread: Varying type doesnot interpolate

Hybrid View

  1. #1
    Newbie Newbie
    Join Date
    Oct 2012
    Posts
    1

    Varying type doesnot interpolate

    I am new to shader programming. I am trying to draw a circle with glsl. My os is Ubuntu 12.04.I used a point with a Size and tried to filter out the points outside the radius.(Altering the alpha value).
    The code is as follows:

    Fragment Shader:
    varying vec2 textureCoordinate;
    const float circleBorderWidth = 0.08;//for anti aliasing
    void main() {
    float d = smoothstep(circleBorderWidth,0.1, 1.0-length(textureCoordinate));
    gl_FragColor = vec4(0.0, 1.0, 0.0, d);
    }

    Vertex Shader:

    attribute vec4 coord3d;
    attribute vec2 varPos;
    varying highp vec2 textureCoordinate;
    void
    main()
    {
    textureCoordinate = varPos;
    gl_FrontColor = gl_Color;
    gl_Position = vec4(coord3d.xyz,1.);
    gl_PointSize = coord3d.w;
    }

    Data:

    float pos[] = {
    -1, -1,
    -1, 1,
    1, 1,
    1, -1,
    };

    float vertices[]={0.0,0.0f,0.0f,100.0f};

    My Draw Scene Method:

    void drawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    program->makeCurrent();
    glEnable(GL_POINT_SMOOTH);
    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
    glEnable(GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    if (varPosAttrib>=0) {
    glVertexAttribPointer( varPosAttrib, 2, GL_FLOAT, GL_FALSE,
    0, pos );-->varPos in Vertex SHader.
    glEnableVertexAttribArray( varPosAttrib );
    }

    if (posAttrib>=0) {
    glVertexAttribPointer(posAttrib, 4, GL_FLOAT, GL_FALSE, 0, vertices); ->coord3d in vertex shader
    glEnableVertexAttribArray(posAttrib);
    glDrawArrays(GL_POINTS, 0, 1);
    }
    glDisable(GL_POINT_SMOOTH);
    glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
    glDisable(GL_BLEND);
    program->release();
    glutSwapBuffers(); //Send the 3D scene to the screen
    }

    This results in drawing a square if I replace d with 1.0 in the following line(in fragment shader):
    gl_FragColor = vec4(0.0, 1.0, 0.0, d); -> if d is replace by 1.0

    I tried to replace the x and y values in gl_FragColor with textureCoordinate.x and textureCoordinate.y. Result was black(so I assume the values are 0.0). Thing which I dont understand is that if I take the length of textureCoordinate than it is always 1.0.(experimented by replacing the value in gl_fragcolor). I am unable to figure out as to what I am doing wrong here. I was expecting the textureCoordinate value to interpolate w.r.t the passed in data(varPos).
    Thanks for any pointers.

  2. #2
    Member Regular Contributor
    Join Date
    Jan 2012
    Location
    Germany
    Posts
    325
    Hello,


    you are drawing one point which is one vertex, so there is only one attribute value and nothing to be interpolated. Maybe you want to draw a quad or trianglestip consisting of 4 vertices? then the varying from these 4 vertices will get interpolated.

Posting Permissions

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