OpenGL: Помогите нарисовать сферу / круг, используя функцию gl - PullRequest
0 голосов
/ 05 января 2012

В моем проекте у меня есть требование нарисовать сферу (может быть, полусфера будет в порядке). Для этого я использовал методы sin () и cos (), чтобы вычислить угол для координат (x, y). Но, следуя этому методу, я чувствую, что это сказывается на производительности моего проекта. Может кто-нибудь помочь мне для рисования сферы с простыми функциями gl.

Как показано ниже, я определил структуру:

typedef struct
{
    float x;
    float y;
}Semi_Sphere;

Semi_Sphere Sky_SemiSphere[180000], Grnd_SemiSphere[180000];

В следующем методе я создаю массив для хранения (x, y) координат. Этот метод я вызываю в своей функции main ().

void createSemi_Sphere_Table (void)
{
float angle_d = 1.1f, angle_r=0.0;
float const Gl_Pi = 3.14;
int i = 0;

while ( angle_d < 11.0 )
{
    angle_r = Gl_Pi/angle_d;
    Sky_SemiSphere[i].y = 1.0f + (((3.50)*sin(angle_r)));
    Sky_SemiSphere[i].x = ((3.7)*cos(angle_r)) - 0.52f;

    angle_d = angle_d + 0.001;
    i = i+1;
}

} 

Затем я использую эти (x, y) координаты в приведенном ниже методе, чтобы нарисовать мою сферу. Я вызываю метод drawSemi_Sphere_Grnd () в моем методе drawScene ().

void drawSemi_Sphere_Grnd (void)
{
int L_Index = 0;

glPushMatrix();
for (L_Index = 0; L_Index < 9750; L_Index++)
{
    glBegin(GL_LINES);
        glVertex2f(Grnd_SemiSphere[L_Index].x, Grnd_SemiSphere[L_Index].y);
        glVertex2f(-1.0f, -2.1f);
    glEnd();
}
glPopMatrix();
}

По вышеописанной процедуре я получаю сферу. Но производительность низкая.

1 Ответ

4 голосов
/ 05 января 2012

Есть много вещей, которые вы можете сделать, чтобы ускорить это, от использования массивов вершин до буфера объектов для отображения списков. Но самое простое это:

glBegin(GL_LINES);
for (L_Index = 0; L_Index < 9750; L_Index++)
{
    glVertex2f(Grnd_SemiSphere[L_Index].x, Grnd_SemiSphere[L_Index].y);
    glVertex2f(-1.0f, -2.1f);
}
glEnd();

Вместо того, чтобы выдавать 9750 отдельных примитивов GL_LINES, вы рисуете один список строк длиной 9750 строк.

...