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);
}