Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. GLSL programming...
Qt 6.11 is out! See what's new in the release blog

GLSL programming...

Scheduled Pinned Locked Moved General and Desktop
2 Posts 1 Posters 1.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    drhalftone
    wrote on last edited by
    #1

    I have a QGLWidget with a GLSL program that uses the RGBA values in a RGBA32F texture as a vertex buffer, reading the vertices using a texel fetch in the vertex shader. For the most part, everything works. The issue I am having is in the paintGL function. Here is what I think I should be using based on the Qt Cube example:
    @
    // BIND OUR VERTEX BUFFER SO THAT THE GRAPHICS CARD CALLS
    // THE VERTEX SHADER FOR EACH AND EVERY POINT IN THE SCAN
    glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]);

    // Tell OpenGL programmable pipeline how to locate vertex position data
    int vertexLocation = program.attributeLocation("qt_Vertex");
    program.enableAttributeArray(vertexLocation);
    glVertexAttribPointer(vertexLocation, 2, GL_SHORT, GL_FALSE, 2 * sizeof(short), (const void *)(0));
    
    // BIND THE INDEX BUFFER SO THAT THE DRAW ELEMENTS COMMAND KNOWS HOW TO CONNECT VERTICES
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]);
    
    // BIND THE SCAN'S XYZA COORDINATES AS TEXTURES
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);
    
    // PASS THE HANDLE TO OUR FRAME BUFFER OBJECT'S TEXTURE
    program.setUniformValue("qt_texture", 0);
    
    // DRAW THE ELEMENTS
    glDrawElements(GL_TRIANGLES, numInds, GL_UNSIGNED_INT, 0);
    

    @

    However, this is not working. I have to replace the lines:
    @
    // Tell OpenGL programmable pipeline how to locate vertex position data
    int vertexLocation = program.attributeLocation("qt_Vertex");
    program.enableAttributeArray(vertexLocation);
    glVertexAttribPointer(vertexLocation, 2, GL_SHORT, GL_FALSE, 2 * sizeof(short), (const void )(0));
    @
    with
    @
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_SHORT, 2
    sizeof(short), 0);
    @
    to get it to work. Does anyone know why this would be the case?

    1 Reply Last reply
    0
    • D Offline
      D Offline
      drhalftone
      wrote on last edited by
      #2

      Okay, I found my mistake. In the vertex shader, I have the following:

      @#extension GL_EXT_gpu_shader4 : require

      uniform sampler2D qt_texture; // THIS TEXTURE HOLDS THE XYZ+TEXTURE COORDINATES
      uniform mat4 qt_projection; // THIS MATRIX IS THE PROJECTION MATRIX
      uniform int qt_rows; // THIS INTEGER HOLDS THE HEIGHT OF THE TEXTURES
      uniform int qt_cols; // THIS INTEGER HOLDS THE WIDTH OF THE TEXTURES
      uniform int qt_mode;

      attribute vec2 qt_vertex; // THIS VECTOR HOLDS THE K=1 DFT COEFFICIENTS

      varying float qt_magnitude; // THIS OUTPUT VALUE HOLDS THE TEXTURE COORDINATE
      varying vec3 qt_normal;

      void main(void)
      {
      // FIGURE OUT WHICH VERTEX THIS IS USING THE VERTEX ID
      int row = gl_VertexID / qt_cols;
      int col = gl_VertexID % qt_cols;
      @

      But I'm not actually doing anything with qt_vertex. I just declared it thinking it would receive the incoming vertices, but since I'm not using those directly, I just never use the qt_vertex in the code. So the compiler was pretty much deleting that variable since its not being used. So when I try to connect to it my paintGL function, its not making a connection since it deleted from the code. So I was getting a -1 returned for the qt_vertex handle.

      My fix was to just include a useless reference to the qt_vertex variable in the main() function to read:
      @void main(void)
      {
      // WE NEED TO ACTUALLY USE THE QT-VERTEX FOR IT TO CONNECT TO THE OPENGL CODE
      qt_vertex;

      // FIGURE OUT WHICH VERTEX THIS IS USING THE VERTEX ID
      int row = gl_VertexID / qt_cols;
      int col = gl_VertexID % qt_cols;
      

      @

      Now everything works fine.

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved