Jump to content

  • Log In with Google      Sign In   
  • Create Account

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.

  • You cannot reply to this topic
2 replies to this topic

#1 Egyptian Coder   Members   -  Reputation: 122

Like
0Likes
Like

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

}


Sponsor:

#2 dpadam450   Members   -  Reputation: 946

Like
0Likes
Like

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

#3 V-man   Members   -  Reputation: 805

Like
0Likes
Like

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];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);




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.



PARTNERS