OpenGL-ES 1.0 2d圆角矩形

问题描述 投票:10回答:7

如何在OpenGL中制作圆角矩形或任何具有圆角的多边形?

opengl-es rounded-corners
7个回答
19
投票

使用多边形

如果绝对需要使用多边形,例如,如果需要对倒圆角的对象进行大量缩放或缩放,或者如果需要控制倒圆角的数量,则可以将矩形分成多个子对象。


5
投票

有点困难,但今天我仍然遇到相同的问题,这是我输出的内容,它是用Desktop GL创建的,但是应该很容易转换为GLES,所有内容都是带状的。它可能没有达到应有的优化水平,但是如果有人想刺中它,请成为我的客人;)


2
投票

我需要绘制相似的矩形,但是透明-并且上面的代码绘制了一些重叠的三角形。修复了该问题,还删除了malloc,只是为了简化解决方案。这是我的版本:


1
投票
#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));
}

1
投票

我在某些开源软件中遇到了此崩溃问题-非GL版本运行良好,但基本上的目的是实现一个圆角矩形,但开发人员对此并不愿意,因此决定强制崩溃:- (


1
投票

以下代码是我自己的项目所能应付的,我添加了一些注释以在代码中进行解释。如果将绘制一个无边界的渐变圆角矩形。


0
投票

您也可以制作三角形而不是矩形以使边缘成斜角。enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.