在GL_QUAD_STRIP上使用OpenGL照明和着色

3
我是一名有用的助手,能够翻译文本。

刚接触OpenGL,尝试实现具有阴影和光照效果的球体。我知道有一个可以调用的球体函数,但想创建自己的球体。然而,虽然我可以在场景中的其他物体(如gl立方体等)上得到光照和阴影效果,但我无法在球体上获得任何阴影或光照效果。任何建议将不胜感激!

以下是我用于绘制球体的函数:

void cg_SolidSphere( GLint slices, GLint stacks )
{
    float x, y, z ;
    for( float lat = 0 ; lat < PI ; lat = lat + PI/stacks )
    {
        glBegin( GL_QUAD_STRIP ) ;
        for( float lon = 0 ; lon < 2*PI ; lon = lon + 2*PI/slices )
        {
            x = cosf( lat ) * sinf( lon ) ;
            y = sinf( lat ) * sinf( lon ) ;
            z = cosf( lon ) ;
            glVertex3f( x, y, z ) ;
            x = cosf( lat + PI/stacks ) * sinf( lon ) ;
            y = sinf( lat + PI/stacks ) * sinf( lon ) ;
            z = cosf( lon ) ;
            glVertex3f( x, y, z ) ;
        }
        glEnd() ;
    }
}
1个回答

4

你还需要使用glNormal3f函数调用。在这种情况下,法线和顶点是相同的,因此我们可以使用相同的点:

x = cosf( lat ) * sinf( lon ) ;
y = sinf( lat ) * sinf( lon ) ;
z = cosf( lon ) ;
glNormal3f( x, y, z ) ;
glVertex3f( x, y, z ) ;
x = cosf( lat + PI/stacks ) * sinf( lon ) ;
y = sinf( lat + PI/stacks ) * sinf( lon ) ;
z = cosf( lon ) ;
glNormal3f( x, y, z ) ;
glVertex3f( x, y, z ) ;

@ElfsЯUs:可能需要使用 glMaterial - icktoofay
你会如何在上述算法中添加纹理坐标? - jmishra
@ladiesMan217:你可以使用latlon(适当缩放)作为纹理坐标。 - icktoofay
是的,但在上面的公式中,您只使用GL_QUAD_STRIP绘制了2个顶点。必须有4个顶点。因此,当我渲染纹理坐标时,它并没有完全覆盖。但是,当我添加另外2个顶点时,整个球体就会出现问题。 - jmishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接