OpenGL - 使用纹理绘制2D多边形形状

时间:2010-03-20 02:13:38

标签: c opengl

我想在C + GL游戏中制作一些效果。到目前为止,我将所有精灵都画成四边形,并且它可以工作。

然而,我试图制作一个大环,有一个纹理跟随该环,因为它比内部环形纹理的四边形占用更少的内存。 我想制作的戒指类型不是圆形GL网眼环(“管”型),而是“纸”2D环。这样我就可以修改环的“宽度”,获得比简单的四环+纹理更多的效果。 到目前为止,我所有的尝试都是......有点荒谬,因为我不太了解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 个答案:

答案 0 :(得分:2)

所以你想要一个环?也就是说,两个圆之间的区域具有相同的中心但半径不同?我试试这样的四边形条:

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个点。

答案 1 :(得分:0)

OpenGL论坛上的帖子here似乎可以满足您的需求。方法概述:

  

如果你想要一个圆圈提交   纹理,你可以使用三角扇。   首先,在中心绘制顶点   圈子。然后绘制顶点   使用圆圈的轮廓   cos(角度)* x和x的半径   sin(角度)* y的半径。自纹理   坐标s和t在范围内   [0 1] =&gt; s =(cos(角度)+1.0)* 0.5和   t =(sin(角度)+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);

}