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

Thread: Transform feedback tutorial, not getting the desired output?

  1. #1
    Junior Member Newbie
    Join Date
    Feb 2018
    Posts
    6

    Transform feedback tutorial, not getting the desired output?

    Not sure if this is the problem, but I'll post my opengl version on linux anyways.

    Code :
     glxinfo | grep 'version'
    server glx version string: 1.4
    client glx version string: 1.4
    GLX version: 1.4
        Max core profile version: 3.3
        Max compat profile version: 3.0
        Max GLES1 profile version: 1.1
        Max GLES[23] profile version: 3.0
    OpenGL core profile version string: 3.3 (Core Profile) Mesa 17.2.4
    OpenGL core profile shading language version string: 3.30
    OpenGL version string: 3.0 Mesa 17.2.4
    OpenGL shading language version string: 1.30
    OpenGL ES profile version string: OpenGL ES 3.0 Mesa 17.2.4
    OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00


    Anyways I'm following the tutorial on this page https://open.gl/feedback and my output is a string of zero's instead of the
    normal square roots of 1 to 5. Here's the code; it compiles with these libs in codeblocks

    -lGL
    -lGLU
    -lGLEW
    -lsfml-graphics
    -lsfml-window
    -lsfml-system

    Here's the code

    Code :
     
     
    // Link statically with GLEW
    #define GLEW_STATIC
     
    // Headers
    #include <GL/glew.h>
    #include <SFML/Window.hpp>
     
    // Vertex shader
    const GLchar* vertexShaderSrc = R"glsl(        in float inValue;    out float geoValue;    void main()    {        geoValue = sqrt(inValue);    } )glsl";
     
    // Geometry shader
    const GLchar* geoShaderSrc = R"glsl(        layout(points) in;    layout(triangle_strip, max_vertices = 3) out;    in float[] geoValue;    out float outValue;    void main()    {        for (int i = 0; i < 3; i++)        {            outValue = geoValue[0] + i;            EmitVertex();        }        EndPrimitive();    } )glsl";
     
    int main()
    {
        sf::ContextSettings settings;
        settings.depthBits = 24;
        settings.stencilBits = 8;
     
        sf::Window window(sf::VideoMode(800, 600, 32), "Transform Feedback", sf::Style::Titlebar | sf::Style::Close, settings);
     
        // Initialize GLEW
        glewExperimental = GL_TRUE;
        glewInit();
     
        // Compile shaders
        GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexShader, 1, &vertexShaderSrc, nullptr);
        glCompileShader(vertexShader);
     
        GLuint geoShader = glCreateShader(GL_GEOMETRY_SHADER);
        glShaderSource(geoShader, 1, &geoShaderSrc, nullptr);
        glCompileShader(geoShader);
     
        // Create program and specify transform feedback variables
        GLuint program = glCreateProgram();
        glAttachShader(program, vertexShader);
        glAttachShader(program, geoShader);
     
        const GLchar* feedbackVaryings[] = { "outValue" };
        glTransformFeedbackVaryings(program, 1, feedbackVaryings, GL_INTERLEAVED_ATTRIBS);
     
        glLinkProgram(program);
        glUseProgram(program);
     
        // Create VAO
        GLuint vao;
        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);
     
        // Create input VBO and vertex format
        GLfloat data[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f };
     
        GLuint vbo;
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
     
        GLint inputAttrib = glGetAttribLocation(program, "inValue");
        glEnableVertexAttribArray(inputAttrib);
        glVertexAttribPointer(inputAttrib, 1, GL_FLOAT, GL_FALSE, 0, 0);
     
        // Create transform feedback buffer
        GLuint tbo;
        glGenBuffers(1, &tbo);
        glBindBuffer(GL_ARRAY_BUFFER, tbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(data) * 3, nullptr, GL_STATIC_READ);
     
        // Perform feedback transform
        glEnable(GL_RASTERIZER_DISCARD);
     
        glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tbo);
     
        glBeginTransformFeedback(GL_TRIANGLES);
            glDrawArrays(GL_POINTS, 0, 5);
        glEndTransformFeedback();
     
        glDisable(GL_RASTERIZER_DISCARD);
     
        glFlush();
     
        // Fetch and print results
        GLfloat feedback[15];
        glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(feedback), feedback);
     
        for (int i = 0; i < 15; i++)
        {
            printf("%f\n", feedback[i]);
        }
     
        glDeleteProgram(program);
        glDeleteShader(geoShader);
        glDeleteShader(vertexShader);
     
        glDeleteBuffers(1, &tbo);
        glDeleteBuffers(1, &vbo);
     
        glDeleteVertexArrays(1, &vao);
     
        window.close();
     
        return 0;
    }


    I removed the version numbers from the shaders as neither 150 or 130 work. thanks ahead!

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,737
    Check shader compilation status with glGetShaderiv(GL_COMPILE_STATUS), linking status with glGetProgramiv(GL_LINK_STATUS), and general error status with glGetError().

  3. #3
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    4,327
    The default GLSL version is 1.10. To compile your shaders, I think you'll find you'll need something greater like:

    Code glsl:
    #version 150

  4. #4
    Junior Member Newbie
    Join Date
    Feb 2018
    Posts
    6
    Quote Originally Posted by Dark Photon View Post
    The default GLSL version is 1.10. To compile your shaders, I think you'll find you'll need something greater like:

    Code glsl:
    #version 150
    Mines at 130 so I would need a newer gpu, correct?

  5. #5
    Senior Member OpenGL Guru Dark Photon's Avatar
    Join Date
    Oct 2004
    Location
    Druidia
    Posts
    4,327
    If your GPU doesn't support OpenGL 3.2 (GLSL 1.50), then yes as that version added Geometry Shader support via GLSL.

Tags for this Thread

Posting Permissions

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