View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# rendering hemi-sphere using opengl

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

### #1Egyptian Coder  Members

Posted 24 April 2012 - 02:40 AM

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_fVerts,GL_DYNAMIC_DRAW);
//Normal
glBindBuffer(GL_ARRAY_BUFFER,SVboId[1]);
glBufferData(GL_ARRAY_BUFFER,sizeof(m_fNormals),
m_fNormals,GL_DYNAMIC_DRAW);
//Textures
glBindBuffer(GL_ARRAY_BUFFER,SVboId[2]);
glBufferData(GL_ARRAY_BUFFER,sizeof(m_fTexCoords),
m_fTexCoords,GL_DYNAMIC_DRAW);

}
void Jellyfish::drawHemiSphere( )
{

glEnableClientState( GL_VERTEX_ARRAY );
glBindBuffer(GL_ARRAY_BUFFER,SVboId[0]);
glVertexPointer( 3, GL_FLOAT, 0, 0 );

for( int j = 0; j < m_iSegements / 2; j++ ) {
glDrawArrays( GL_TRIANGLE_STRIP, 0,   (m_iSegements + 1)*2   );
}
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
glDisableClientState( GL_NORMAL_ARRAY );

}


Posted 24 April 2012 - 10:01 AM

Post a picture. I dont' get this:
for( int j = 0; j < m_iSegements / 2; j++ ) {
glDrawArrays( GL_TRIANGLE_STRIP, 0, (m_iSegements + 1)*2 );
}

You have a local variable j that is never used. Therefore you are drawing the same thing over and over again. Not to mention it always starts at 0. So if all your segments of the sphere are unconnected, then your loop would try to draw 0-100 verts, 0-200 verts, 0-300.
Probably want:
glDrawArrays(GL_TRIANGLE_STRIP, j*number_of_verts_insegment, number_of_verts_insegment); draw 0 to 100, 100 to 200, 200 to 300

### #3V-man  Members

Posted 26 April 2012 - 03:20 PM

Check to see if your sizeof() are returning the actual array size.
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];