glDrawArrayInstanced is drawing only one instance. Whats wrong with my code

The below code is drawing only one instance and that too at origin.
What is that I am missing.
No glError.
Thanks in advance.
I am trying the instancing first time.
I am not using any glsl here.



void bp3DNastranRep::PrepareCrossBuffer()// preparing the buffers
{
    Point *pPts = _data->GetPoints();
    if (!pPts || _data->nbPts==0)
        return;

    PFNGLGENBUFFERSPROC glGenBuffers;
    PFNGLBINDBUFFERPROC glBindBuffer;
    PFNGLBUFFERDATAPROC glBufferData;
    PFNGLBUFFERSUBDATAPROC glBufferSubData;

    PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
    PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;

    glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
    glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
    glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
    glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");
    
    glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
    glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");


    float p1[3], p2[3], p3[3], p4[3], n1[] = { 1.f, 0.f, 0.f }, n2[] = { 0.f, 1.f, 0.f };
    float DEG2RAD = 3.14159f / 180.f;
    float degInRad = 45.0f * DEG2RAD;
    float radius = (float)m_pCRS->GetSphereRepRadius();

    p1[0] = cos(degInRad)*radius*n1[0] + sin(degInRad)*radius*n2[0];
    p1[1] = cos(degInRad)*radius*n1[1] + sin(degInRad)*radius*n2[1];
    p1[2] = cos(degInRad)*radius*n1[2] + sin(degInRad)*radius*n2[2];

    degInRad = 225.0f * DEG2RAD;
    p2[0] = cos(degInRad)*radius*n1[0] + sin(degInRad)*radius*n2[0];
    p2[1] = cos(degInRad)*radius*n1[1] + sin(degInRad)*radius*n2[1];
    p2[2] = cos(degInRad)*radius*n1[2] + sin(degInRad)*radius*n2[2];

    degInRad = 135.0f * DEG2RAD;
    p3[0] = cos(degInRad)*radius*n1[0] + sin(degInRad)*radius*n2[0];
    p3[1] = cos(degInRad)*radius*n1[1] + sin(degInRad)*radius*n2[1];
    p3[2] = cos(degInRad)*radius*n1[2] + sin(degInRad)*radius*n2[2];

    degInRad = 315.0f * DEG2RAD;
    p4[0] = cos(degInRad)*radius*n1[0] + sin(degInRad)*radius*n2[0];
    p4[1] = cos(degInRad)*radius*n1[1] + sin(degInRad)*radius*n2[1];
    p4[2] = cos(degInRad)*radius*n1[2] + sin(degInRad)*radius*n2[2];


    const GLfloat g_vertex_buffer_data[] = {
        p1[0], p1[1], p1[2],
        p2[0], p2[1], p2[2],
        p3[0], p3[1], p3[2],
        p4[0], p4[1], p4[2],
    };

    int iSizePos = _data->nbPts * 4;
    float *pPos = new float[iSizePos];
    unsigned char *pClr = new unsigned char[iSizePos];

        Vertex *pVerts = _data->GetVerts();
    Colors *pPids = _data->GetColors();
    int i = 0, iCt = 0, iCtClr = 0;
    for (i = 1; i <= _data->nbPts; ++i)
    {
        pPos[iCt++] = pVerts[pPts[i].v].xyz[0];
        pPos[iCt++] = pVerts[pPts[i].v].xyz[1];
        pPos[iCt++] = pVerts[pPts[i].v].xyz[2];
        pPos[iCt++] = 10.0f;

        pClr[iCtClr++] = pPids[pPts[i].p].rgba[0]*225.0;
        pClr[iCtClr++] = pPids[pPts[i].p].rgba[1]*225.0;
        pClr[iCtClr++] = pPids[pPts[i].p].rgba[2]*225.0;
        pClr[iCtClr++] = 255;
    }

    glGenBuffers(1, &m_iVBO_HNRep);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNRep);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    //glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(g_vertex_buffer_data), g_vertex_buffer_data);

    glGenBuffers(1, &m_iVBO_HNPos);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNPos);
    glBufferData(GL_ARRAY_BUFFER, iSizePos  * sizeof(GLfloat), NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, iSizePos  * sizeof(GLfloat), pPos);


    glGenBuffers(1, &m_iVBO_HNClr);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNClr);
    glBufferData(GL_ARRAY_BUFFER, iSizePos  * sizeof(GLubyte), NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, iSizePos * sizeof(GLubyte), pClr);

    if (pPos){ delete[] pPos; pPos = 0; }
    if (pClr){ delete[] pClr; pClr = 0; }
}

void bp3DNastranRep:: DrawCross(bpCurrentRenderState *crs)// drawing the instances
{
    Point *pPts = _data->GetPoints();
    if (!pPts || _data->nbPts == 0)
        return;

    if (m_iVBO_HNRep == 0 || m_iVBO_HNClr == 0 || m_iVBO_HNPos == 0)
        return;
    PFNGLGENBUFFERSPROC glGenBuffers;
    PFNGLBINDBUFFERPROC glBindBuffer;
    PFNGLBUFFERDATAPROC glBufferData;
    PFNGLBUFFERSUBDATAPROC glBufferSubData;

    PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
    PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
    PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
    PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;

    glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");
    glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
    glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");
    glBufferSubData = (PFNGLBUFFERSUBDATAPROC)wglGetProcAddress("glBufferSubData");

    glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glEnableVertexAttribArray");
    glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress("glDisableVertexAttribArray");
    glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress("glBindVertexArray");
    glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress("glVertexAttribPointer");
    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNRep);
    glVertexAttribPointer(
        0, // attribute. No particular reason for 0, but must match the layout in the shader.
        3, // size
        GL_FLOAT, // type
        GL_FALSE, // normalized?
        0, // stride
        (void*)0 // array buffer offset
        );

    // 2nd attribute buffer : positions of particles' centers
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNPos);
    glVertexAttribPointer(
        1, // attribute. No particular reason for 1, but must match the layout in the shader.
        4, // size : x + y + z + size => 4
        GL_FLOAT, // type
        GL_FALSE, // normalized?
        0, // stride
        (void*)0 // array buffer offset
        );

    // 3rd attribute buffer : particles' colors
    glEnableVertexAttribArray(2);
    glBindBuffer(GL_ARRAY_BUFFER, m_iVBO_HNClr);
    glVertexAttribPointer(
        2, // attribute. No particular reason for 1, but must match the layout in the shader.
        4, // size : r + g + b + a => 4
        GL_UNSIGNED_BYTE, // type
        GL_TRUE, // normalized? *** YES, this means that the unsigned  char[4] will be accessible with a vec4 (floats) in the shader ***
        0, // stride
        (void*)0 // array buffer offset
        );

    PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor;
    PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced;
    PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced;

    glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)wglGetProcAddress("glVertexAttribDivisor");
    glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)wglGetProcAddress("glDrawArraysInstanced");
    glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)wglGetProcAddress("glDrawElementsInstanced");

    // These functions are specific to glDrawArrays*Instanced*.
    // The first parameter is the attribute buffer we're talking about.
    // The second parameter is the "rate at which generic vertex attributes advance when rendering multiple instances"
    glVertexAttribDivisor(0, 0); // particles vertices : always reuse the same 4 vertices -> 0
    glVertexAttribDivisor(1, 1); // positions : one per quad (its center) -> 1
    glVertexAttribDivisor(2, 1); // color : one per quad -> 1

    // Draw the particules !
    // This draws many times a small triangle_strip (which looks like a quad).
    // This is equivalent to :
    // for(i in ParticlesCount) : glDrawArrays(GL_TRIANGLE_STRIP, 0, 4),
    // but faster.

    glBindVertexArray(m_iVBO_HNPos);
    glDrawArraysInstanced(GL_LINE_LOOP, 0, 4, _data->nbPts);

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
}

These functions are specific to glDrawArraysInstanced.

No, they are not. These are Vertex Array functions; they affect the currently bound VAO. Since you didn’t bind the correct VAO before calling them, they do not have the intended effect.

Also, the OpenGL function loading code intersperced in your real code makes it difficult to read your real code.

Dear Alfonse, My code is very minimal here and is to fill

  1. shape that should be repeated - cross with four points to draw two lines(g_vertex_buffer_data)
  2. positions where the shape should be repeated (pPos)
  3. rgba values at each position(pClr)

Let me know if anything is not clear, I will explain.
Thanks in advance