0
\$\begingroup\$

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


}
\$\endgroup\$
3
  • \$\begingroup\$ You aren't using j in the line glDrawArrays( GL_TRIANGLE_STRIP, 0, (m_iSegements + 1)*2 );, might that be the/a problem? \$\endgroup\$
    – Eric
    Apr 24, 2012 at 9:15
  • \$\begingroup\$ might be, but how do I use it? \$\endgroup\$ Apr 24, 2012 at 9:18
  • \$\begingroup\$ Start with a working example, them move on from there. \$\endgroup\$
    – House
    Apr 24, 2012 at 16:51

1 Answer 1

1
\$\begingroup\$

Your use of sizeof is invalid. It only works like this on fixed-size arrays. Instead of:

sizeof(m_fVerts)

Use:

sizeof(*m_fVerts) * (segments+1)*2*3;
\$\endgroup\$
7
  • \$\begingroup\$ @Same Hocevar That made something to be appeard on screen, but just a mess of triangles. I bet there are other calculations wrong in the glDrawArrays ? \$\endgroup\$ Apr 24, 2012 at 9:27
  • \$\begingroup\$ @AhmedSaleh are you really drawing a triangle strip? I'd try GL_TRIANGLES instead of GL_TRIANGLE_STRIP as a next step. \$\endgroup\$ Apr 24, 2012 at 9:33
  • \$\begingroup\$ ,Thanks for the reply. I did your suggestion, but still I see a cylinder, a not a full hemi-sphere. Is the drawing code correct? for( int j = 0; j < m_iSegements / 2; j++ ) { glDrawArrays( GL_TRIANGLES, 0, (m_iSegements + 1)*2 ); } \$\endgroup\$ Apr 24, 2012 at 9:41
  • \$\begingroup\$ @AhmedSaleh It's because you need to take Eric's suggestion into account, too; you loop over i and j yet only fill an array of size segments+1 vertices; your arrays need to be of size (segments+1)*(segments/2) and use both i and j in the index computation. \$\endgroup\$ Apr 24, 2012 at 9:46
  • \$\begingroup\$ Thanks, I tried this but still now working for( int j = 0; j < m_iSegements / 2; j++ ) { for( int i = 0; i <= m_iSegements; i++ ) { glDrawArrays( GL_TRIANGLES, j, (m_iSegements + i)*2 ); } } \$\endgroup\$ Apr 24, 2012 at 9:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .