Hi, folks
I need draw 16k torus. But if I use glDrawElements(), it cost 15ms. I try to use glDrawElementsInstancedEXT(), but I can’t draw all the torus, just 2 torus. Anyone can give me any advice? This the code snippet. Thanks very much!
void Demo::_initGL()
{
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vShader, 1, &vertexShader, 0);
glCompileShader(vShader);
program = glCreateProgram();
glAttachShader(program, vShader);
glLinkProgram(program);
// check if program linked
GLint success = 0;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
char temp[256];
glGetProgramInfoLog(program, 256, 0, temp);
printf("Failed to link program:
%s
", temp);
glDeleteProgram(program);
program = 0;
}
}
void Demo::render()
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
GLint texLoc;
texLoc = glGetUniformLocationARB(program, "posTex");
glUniform1iARB(texLoc, 0);
texLoc = glGetUniformLocationARB(program, "quatTex");
glUniform1iARB(texLoc, 1);
glUseProgram(program);
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_NORMAL_ARRAY );
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB,indexVBO);
glBindBufferARB(GL_ARRAY_BUFFER, vertexVBO);
glVertexPointer(3,GL_FLOAT,sizeof(Vertex),0);
glNormalPointer(GL_FLOAT,sizeof(Vertex),(void*)(sizeof(Vertex)/2));
glDrawElementsInstancedEXT(GL_QUADS, 150*4, GL_UNSIGNED_INT, 0, nBodies);
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_NORMAL_ARRAY );
glUseProgram(0);
}
// Vertex shader.
const char * vertexShader =
"#version 120
"
"#extension GL_EXT_gpu_shader4 : enable
"
"uniform sampler2D posTex;
"
"uniform sampler2D quatTex;
"
"const float PI = 3.1415926;
"
"varying vec4 quat;
"
"void main(void)
"
"{
"
" vec4 centerOfMass;
"
" vec2 texCrd = vec2(gl_InstanceID, 0);
"
" centerOfMass = texture2D(posTex, texCrd);
"
" rotatedPos = gl_Vertex + centerOfMass;
"
" rotatedPos.w = 1.0;
"
" gl_Position = gl_ModelViewProjectionMatrix * rotatedPos;
"
"}
"
"
";