2010-03-20 222 views
2

我想在C + GL游戏中制作一些效果。到目前为止,我把所有的精灵都画成了一个四边形,并且它可以工作。OpenGL - 绘制具有纹理的2D多边形形状

但是,我试图让一个大环出现在一个纹理之后,因为它需要的内存少于带环纹理的四边形。 我想制作的戒指的类型不是圆形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

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

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

是的!这正是我想要的!非常感谢你! 我可以看到我的错误纹理以及...再次感谢,真的! – plonkplonk 2010-03-20 03:22:15

0

在OpenGL论坛上的帖子here似乎做你想做的。方法概述:

如果你想要一个带有 纹理的圆圈,你可以使用三角形风扇。 首先,绘制圆的中心 的顶点。然后在圆的轮廓上绘制顶点 ,使用 cos(角度)*半径为x和 sin(角度)*半径为y。由于纹理坐标s和t在范围 [0 1] => 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); 

} 
+0

不幸的是,不,它直接绘制纹理,是一个圆圈(没有机会改变环的宽度,只有它的大小)。纹理也是“字面上”绘制的。我应该指出,我使用的纹理是矩形(如闪电)而不是文字环。 我想要做的是在可变宽度的线条中多次重复“闪电”,给出一个环的幻觉。 也许我应该在问题上这样解释它? – plonkplonk 2010-03-20 02:41:46

+1

更清晰永远是一个加号! :D – 2010-03-20 03:02:22