I'm trying to render a hemisphere in OpenGL, the problem that the hemisphere isn't rendered at all, only part of it. I initialize it, then at each frame I draw it using the following code. I'm trying to use a VBO for drawing it.
void Jellyfish::Init_HemiSphere(const float radius, const int segments )
{
m_iSegements = segments;
m_fVerts= new float[(segments+1)*2*3];
m_fNormals= new float[(segments+1)*2*3];
m_fTexCoords = new float[(segments+1)*2*2];
for( int j = 0; j < segments / 2; j++ )
{
float theta1 = j * 2 * 3.14159f / segments - ( 3.14159f );
float theta2 = (j + 1) * 2 * 3.14159f / segments - ( 3.14159f );
for( int i = 0; i <= segments; i++ )
{
Vec3f e, p;
float theta3 = i * 2 * 3.14159f / segments;
e.x = math<float>::cos( theta1 ) * math<float>::cos( theta3 );
e.y = math<float>::sin( theta1 );
e.z = math<float>::cos( theta1 ) * math<float>::sin( theta3 );
p = e * radius;
m_fNormals[i*3*2+0] = e.x; m_fNormals[i*3*2+1] = e.y; m_fNormals[i*3*2+2] = e.z;
m_fTexCoords[i*2*2+0] = 0.999f - i / (float)segments; m_fTexCoords[i*2*2+1] = 0.999f - 2 * j / (float)segments;
m_fVerts[i*3*2+0] = p.x; m_fVerts[i*3*2+1] = p.y; m_fVerts[i*3*2+2] = p.z;
e.x = math<float>::cos( theta2 ) * math<float>::cos( theta3 );
e.y = math<float>::sin( theta2 );
e.z = math<float>::cos( theta2 ) * math<float>::sin( theta3 );
p = e * radius;
m_fNormals[i*3*2+3] = e.x; m_fNormals[i*3*2+4] = e.y; m_fNormals[i*3*2+5] = e.z;
m_fTexCoords[i*2*2+2] = 0.999f - i / (float)segments; m_fTexCoords[i*2*2+3] = 0.999f - 2 * ( j + 1 ) / (float)segments;
m_fVerts[i*3*2+3] = p.x; m_fVerts[i*3*2+4] = p.y; m_fVerts[i*3*2+5] = p.z;
}
}
glGenBuffers(3,&SVboId[0]);
//Vertex
glBindBuffer(GL_ARRAY_BUFFER,SVboId[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(*m_fVerts)*(m_iSegements+1)*2*3,
m_fVerts,GL_DYNAMIC_DRAW);
// Normals
glBindBuffer(GL_ARRAY_BUFFER,SVboId[1]);
glBufferData(GL_ARRAY_BUFFER,sizeof(*m_fNormals)*(m_iSegements+1)*2*3,
m_fNormals,GL_DYNAMIC_DRAW);
}
void Jellyfish::drawHemiSphere( )
{
/*glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, sizeof(*m_fVerts)*(m_iSegements+1)*2*3, m_fVerts );*/
glEnableClientState( GL_VERTEX_ARRAY );
glBindBuffer(GL_ARRAY_BUFFER,SVboId[0]);
glVertexPointer( 3, GL_FLOAT, 0, 0 );
glEnableClientState( GL_NORMAL_ARRAY );
glBindBuffer(GL_NORMAL_ARRAY,SVboId[1]);
glNormalPointer( GL_FLOAT, 0,0 );
/*glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, sizeof(*m_fTexCoords)*(m_iSegements+1)*2*3, m_fTexCoords );
glEnableClientState( GL_NORMAL_ARRAY );
glNormalPointer( GL_FLOAT, sizeof(*m_fNormals)*(m_iSegements+1)*2*2, m_fNormals );*/
for( int j = 0; j < m_iSegements / 2; j++ ) {
for( int i = 0; i <= m_iSegements; i++ )
{
}
glDrawArrays( GL_TRIANGLES, 0, (m_iSegements + 1)*2 );
}
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_NORMAL_ARRAY );
}
jin the lineglDrawArrays( GL_TRIANGLE_STRIP, 0, (m_iSegements + 1)*2 );, might that be the/a problem? – Eric Apr 24 '12 at 9:15