如何在OpenGL中制作圆角矩形或任何具有圆角的多边形?
如果绝对需要使用多边形,例如,如果需要对倒圆角的对象进行大量缩放或缩放,或者如果需要控制倒圆角的数量,则可以将矩形分成多个子对象。
有点困难,但今天我仍然遇到相同的问题,这是我输出的内容,它是用Desktop GL创建的,但是应该很容易转换为GLES,所有内容都是带状的。它可能没有达到应有的优化水平,但是如果有人想刺中它,请成为我的客人;)
我需要绘制相似的矩形,但是透明-并且上面的代码绘制了一些重叠的三角形。修复了该问题,还删除了malloc,只是为了简化解决方案。这是我的版本:
#define PI_2 1.57079632679490f
#define SIN(x) SDL_sinf (x)
#define COS(x) SDL_cosf (x)
typedef struct _g2d_vertex_t g2d_vertex_t;
struct _g2d_vertex_t {
float x, y;
};
// pVertices - destination buffer
// nVertices - buffer size
// dx - width
// dy - height
// r - radius
// returnes the number of used vertices
int
__cdecl buildRoundedRect (g2d_vertex_t * pVertices, int nVertices, float dx, float dy, float r) {
float a, da;
int i1, i2, i3, i4, n;
if (nVertices < 4) { return 0; }
if (nVertices == 4) {
pVertices [0].x = 0.f; pVertices [0].y = 0.f;
pVertices [1].x = dx; pVertices [1].y = 0.f;
pVertices [2].x = dx; pVertices [2].y = dy;
pVertices [3].x = 0.f; pVertices [3].y = dy;
return nVertices;
}
n = nVertices >> 2;
if (r > dx / 2.f) { r = dx / 2.f; }
if (r > dy / 2.f) { r = dy / 2.f; }
a = 0.f;
da = PI_2 / (float) (n - 1);
for (i1 = 0, i2 = (n << 1) - 1, i3 = n << 1, i4 = (n << 2) - 1; i1 < n; i1++, i2--, i3++, i4--, a += da) {
float cosA = COS (a), sinA = SIN (a);
pVertices [i1].x = (dx - r) + r * cosA; pVertices [i1].y = (dy - r) + r * sinA;
pVertices [i2].x = r - r * cosA; pVertices [i2].y = (dy - r) + r * sinA;
pVertices [i3].x = r - r * cosA; pVertices [i3].y = r - r * sinA;
pVertices [i4].x = (dx - r) + r * cosA; pVertices [i4].y = r - r * sinA;
}
return n << 2;
}
void drawRoundedRect () {
g2d_vertex_t vertices [50];
glColor3f (0.3f, 0.5f, 0.2f);
glVertexPointer (2, GL_FLOAT, 0, vertices);
glEnableClientState (GL_VERTEX_ARRAY);
glDrawArrays (GL_LINE_LOOP, 0, buildRoundedRect (vertices, 50 /* max count of vertices to use: 4 - 50 */, 150.f, 80.f, 20.f));
}
我在某些开源软件中遇到了此崩溃问题-非GL版本运行良好,但基本上的目的是实现一个圆角矩形,但开发人员对此并不愿意,因此决定强制崩溃:- (
以下代码是我自己的项目所能应付的,我添加了一些注释以在代码中进行解释。如果将绘制一个无边界的渐变圆角矩形。