OpenGL - рисование 2D многоугольников с текстурой - PullRequest
2 голосов
/ 20 марта 2010

Я пытаюсь сделать несколько эффектов в игре C + GL. Пока я рисую все свои спрайты как квад, и это работает.

Тем не менее, я пытаюсь сделать так, чтобы большое кольцо появлялось время от времени, с текстурой, следующей за этим кольцом, поскольку это занимает меньше памяти, чем у квадрата с текстурой кольца внутри. Тип кольца, которое я хочу сделать, - это не кольцо GL с круглой формой (типа «труба»), а «бумажное» 2D кольцо. Таким образом, я могу изменить «ширину» кольца, получая больший эффект, чем простая текстура quad + ring. До сих пор все мои попытки были ... отчасти нелепы, так как я не слишком хорошо понимаю координаты GL (и я не могу по-настоящему понять доступную документацию ... Я просто дизайнер без помощи кодера или опыта. N00b, в основном).

glBegin(GL_POLYGON);
for(i = 0;i < 360; i += 10){
  glTexCoord2f(0, 0);
  glVertex2f(Cos(i)*(H-10),Sin(i)*H);
  glTexCoord2f(0, HP);
  glVertex2f(Sin(i)*(H-10),Cos(i)*(H-10));
  glTexCoord2f(WP, HP);
  glVertex2f(Cos(i)*H,Sin(i)*(H-10));
  glTexCoord2f(WP, 0);
  glVertex2f(Sin(i)*H,Cos(i)*H);
} 
glEnd();

Это моя последняя попытка, и кажется, что она генерирует "солнечные лучи" с правого края круга вместо кольца. Это забавный эффект, но определенно не то, что я хочу. Другие результаты включали в себя круг, выглядящий точно так же, как текстурированный квад (то есть буквально рисующий спрайт) или что-то похожее на поп-арт фильтр при работе над этим ходом мыслей.

Похоже, моя логика здесь совершенно ошибочна, так что бы было проще всего получить такое кольцо? Не нужно отвечать в коде, просто руководство для неопытного пользователя ...

Редактировать: другим способом обозначить то, что я хочу, была бы последовательность повернутых прямоугольников, соединенных друг с другом, образуя кольцо низкого разрешения.

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

Итак, вы хотите кольцо? То есть площадь между двумя кругами с одинаковым центром, но разными радиусами? Я бы попробовал четырехслойную ленту вот так:

glBegin(GL_QUAD_STRIP);
for(i = 0; i <= 360; i += 10){
  glTexCoord2f(WP*i/360, 0);
  glVertex2f(Cos(i)*(H-10),Sin(i)*(H-10));
  glTexCoord2f(WP*i/360, HP);
  glVertex2f(Cos(i)*H,Sin(i)*H);
} 
glEnd();

Каждый квад - это 10-градусный сектор кольца. Обратите внимание, что если вы хотите нарисовать N четырехугольников в полосе, это займет 2 * (N + 1) пункта, поэтому мы рисуем всего 2 * (36 + 1) = 74 пункта.

0 голосов
/ 20 марта 2010

Пост здесь на форумах OpenGL, кажется, делает то, что вы хотите. Обзор подхода:

Если вы хотите, чтобы круг, заполненный текстуры, вы можете использовать треугольник веер. Сначала нарисуйте вершину в центре круга. Затем нарисуйте вершину на контур круга, используйте cos (угол) * радиус для х и sin (угол) * радиус для y. С текстурой координаты s и t находятся в диапазоне [0 1] => s = (cos (угол) +1,0) * 0,5 и t = (грех (угол) +1,0) * 0,5. Текстура координата для вершины в центр круга (0.5,0.5).

GLvoid draw_circle(const GLfloat radius,const GLuint num_vertex)
{
  GLfloat vertex[4]; 
  GLfloat texcoord[2];

  const GLfloat delta_angle = 2.0*M_PI/num_vertex;

  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D,texID);
  glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
  glBegin(GL_TRIANGLE_FAN);

  //draw the vertex at the center of the circle
  texcoord[0] = 0.5;
  texcoord[1] = 0.5;
  glTexCoord2fv(texcoord);

  vertex[0] = vertex[1] = vertex[2] = 0.0;
  vertex[3] = 1.0;        
  glVertex4fv(vertex);

  for(int i = 0; i < num_vertex ; i++)
  {
    texcoord[0] = (std::cos(delta_angle*i) + 1.0)*0.5;
    texcoord[1] = (std::sin(delta_angle*i) + 1.0)*0.5;
    glTexCoord2fv(texcoord);

    vertex[0] = std::cos(delta_angle*i) * radius;
    vertex[1] = std::sin(delta_angle*i) * radius;
    vertex[2] = 0.0;
    vertex[3] = 1.0;
    glVertex4fv(vertex);
  }

  texcoord[0] = (1.0 + 1.0)*0.5;
  texcoord[1] = (0.0 + 1.0)*0.5;
  glTexCoord2fv(texcoord);

  vertex[0] = 1.0 * radius;
  vertex[1] = 0.0 * radius;
  vertex[2] = 0.0;
  vertex[3] = 1.0;
  glVertex4fv(vertex);
  glEnd();

  glDisable(GL_TEXTURE_2D);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...