2

我想在没有任何引擎的纯 OpenGL ES 2.0 中绘制球体。我写下一个代码:

 int GenerateSphere (int Slices, float radius, GLfloat **vertices, GLfloat **colors) {
 srand(time(NULL));
 int i=0, j = 0;
 int Parallels = Slices ;
 float tempColor = 0.0f;    
 int VerticesCount = ( Parallels + 1 ) * ( Slices + 1 );
 float angleStep = (2.0f * M_PI) / ((float) Slices);

 // Allocate memory for buffers
 if ( vertices != NULL ) {
    *vertices = malloc ( sizeof(GLfloat) * 3 * VerticesCount );
 }
 if ( colors != NULL) {
    *colors = malloc( sizeof(GLfloat) * 4 * VerticesCount);
 }

 for ( i = 0; i < Parallels+1; i++ ) {
     for ( j = 0; j < Slices+1 ; j++ ) {

         int vertex = ( i * (Slices + 1) + j ) * 3;

         (*vertices)[vertex + 0] = radius * sinf ( angleStep * (float)i ) *
                    sinf ( angleStep * (float)j );
         (*vertices)[vertex + 1] = radius * cosf ( angleStep * (float)i );
         (*vertices)[vertex + 2] = radius * sinf ( angleStep * (float)i ) *
                        cosf ( angleStep * (float)j );
         if ( colors ) {
                int colorIndex = ( i * (Slices + 1) + j ) * 4;
                tempColor = (float)(rand()%100)/100.0f;

                (*colors)[colorIndex + 0] =  0.0f;
                (*colors)[colorIndex + 1] =  0.0f;
                (*colors)[colorIndex + 2] =  0.0f;
                (*colors)[colorIndex + (rand()%4)] = tempColor;
                (*colors)[colorIndex + 3] =  1.0f;
            }
        }
    }
    return VerticesCount;
}

我正在使用下一个代码绘制它:

glDrawArrays(GL_TRIANGLE_STRIP, 0, userData->numVertices);

其中 userData->numVertices - 来自函数 GenerateSphere 的 VerticesCount。但是在屏幕上绘制系列三角形,这些不是球体近似!我认为,我需要计算顶点并使用 OpenGL ES 2.0 函数 glDrawElements() (带有数组,包含数字顶点)。但在屏幕上绘制的一系列三角形并不是近似球体。如何绘制球体近似?如何指定顺序顶点(OpenGL ES 2.0 术语中的索引)?

4

2 回答 2

11

在开始使用 OpenGL ES 之前,这里有一些建议:

避免臃肿的 CPU/GPU 性能

通过使用另一个程序离线渲染形状来消除密集的计算周期肯定会有所帮助。除了导出包含形状等的点 [x,y,z] 的结果集合之外,这些程序将提供有关形状/网格的其他详细信息。

我经历了所有这些痛苦,因为我一直在尝试搜索算法来渲染球体等,然后尝试优化它们。我只是想在将来节省您的时间。只需使用 Blender,然后您最喜欢的编程语言来解析从 Blender 导出的 obj 文件,我使用 Perl。以下是渲染球体的步骤:(使用 glDrawElements 因为 obj 文件包含索引数组)

1) Download and install Blender.

图像-1

2) From the menu, add sphere and then reduce the number of rings and segments.

图像-2

3) Select the entire shape and triangulate it.

图像-3

4) Export an obj file and parse it for the meshes.

图像 4

您应该能够从以下文件中掌握渲染球体的逻辑:http: //pastebin.com/4esQdVPP。它适用于 Android,但概念是相同的。希望这可以帮助。

于 2013-01-20T14:59:45.947 回答
0

我在球体和其他几何形状上苦苦挣扎。我研究了一段时间,并创建了一个 Objective-C 类来使用索引和非索引机制创建坐标、法线和纹理坐标,该类在这里:

http://www.whynotsometime.com/Why_Not_Sometime/Code_Snippets.html

有趣的是看到生成的表示几何的三角形是降低分辨率(在生成坐标之前设置分辨率属性)。此外,您可以使用 GL_LINE_STRIP 而不是 GL_TRIANGLES 来查看更多信息。

我同意 wimp 的评论,即由于计算坐标通常只发生一次,因此使用的 CPU 周期并不多。此外,有时人们确实只想画一个球或世界或......

于 2014-01-04T19:42:47.693 回答