OpenGL - 将字母 T 渲染为八边形 [重复]

Posted

技术标签:

【中文标题】OpenGL - 将字母 T 渲染为八边形 [重复]【英文标题】:OpenGL - Render the letter T as an octagon [duplicate] 【发布时间】:2021-03-23 16:41:11 【问题描述】:

我正在尝试渲染字母 T,但它看起来缺少一点。 当我渲染一个普通的八边形时,它看起来应该是这样的。

这里是字母 T 和一个普通八边形的顶点(前三个浮点数是 (x,y,z),其他三个是 (r,g,b) 表示颜色):

    GLfloat octagonVertices[] = 
         0.50f,  0.20f, 0.00f, 0.46f, 0.80f, 0.46f,
         0.50f, -0.20f, 0.00f, 0.46f, 0.80f, 0.46f,
         0.20f, -0.50f, 0.00f, 0.46f, 0.80f, 0.46f,
        -0.20f, -0.50f, 0.00f, 0.46f, 0.80f, 0.46f,
        -0.50f, -0.20f, 0.00f, 0.46f, 0.80f, 0.46f,
        -0.50f,  0.20f, 0.00f, 0.46f, 0.80f, 0.46f,
        -0.20f,  0.50f, 0.00f, 0.46f, 0.80f, 0.46f,
         0.20f,  0.50f, 0.00f, 0.46f, 0.80f, 0.46f
    ;

    GLfloat tauVertices[] = 
        -0.01f,  0.45f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.68f,  0.45f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.68f,  0.36f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.39f,  0.36f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.39f, -0.45f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.28f, -0.45f, 0.00f, 1.00f, 0.00f, 0.00f,
         0.28f,  0.36f, 0.00f, 1.00f, 0.00f, 0.00f,
        -0.01f,  0.36f, 0.00f, 1.00f, 0.00f, 0.00f
    ;

这是我的顶点缓冲区:

    glBindVertexArray(vao[1]);
    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(tauVertices), tauVertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (const void*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (const void*)(3 * 
    sizeof(GLfloat)));
    glEnableVertexAttribArray(1);

这是我如何渲染我的形状:

        glBindVertexArray(vbo[1]);
        glDrawArrays(GL_POLYGON, 0, 8);

【问题讨论】:

使用三角形并缝合它。 (4 个三角形) 您是如何获得3 * sizeof(tauVertices) 的数据大小的?顶点之间的连通性如何给出?您正在渲染哪种类型的几何图形(三角形、三角形条形...)? @Rabbid76 我必须使用 GL_POLYGON,而不是 GL_TRIANGLES @leech 你为什么要这么做?没有可以画多边形,但不能画三角形的OpenGL版本。 @BDL 我认为 3 * 是复制 + 粘贴的错误,但它仍然没有解决我的问题。我正在使用 GL_POLYGON 【参考方案1】:

来自docs(强调我的):

GL_POLYGON

绘制单个多边形。顶点 1 到 N 定义了这个 多边形。

由于字母 T 不是凸面,因此不能将其绘制为单个多边形。

提供非凸多边形时的结果未定义。它可能会针对一组特定的顶点使用一个特定的硬件,但通常无法提前知道输出将是什么。

我强烈建议不要使用 GL_POLYGON 渲染:此功能不是现代 OpenGL 的一部分,并且在 10 多年前已被弃用。现代方法是绘制覆盖多边形表面的三角形(例如,通过将顶点与索引缓冲区正确连接)。

另请注意,您上传到 VBO 的数据大小看起来不正确。 3 * sizeof(tauVertices) 将上传三倍于 tauVertices 包含的数据。

【讨论】:

但是当我将希腊字母 gamma (Γ) 渲染为六边形时,我很好。 Gamma 也是一个非凸多边形。我也固定了数据的大小 @leech:当你提供一个非凸多边形时会发生什么是未定义的。它可能适用于某些驱动程序版本的某些配置,甚至可能在每次运行代码时产生不同的结果。不可能说到底会发生什么。我强烈建议不要使用多边形渲染模式:它在 10 多年前已从 OpenGL 标准中删除。 所以没有办法用 GL_POLYGON 渲染非凸形状,对吧? @leech:不,没有办法用 GL_POLYGON 渲染非凸形状。 如果我可以将字母分成两个凸形呢?

以上是关于OpenGL - 将字母 T 渲染为八边形 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 渲染到 FBO

如何为 OpenGL 文本渲染计算字符映射中的最佳字形边界

使用索引在 OpenGL 中渲染四边形的问题

渲染大量四边形的有效方法(LibGDX/OpenGL ES)

在 OpenGL 中渲染网格多边形 - 非常慢

使用 OpenGL / LibGDX 的后处理问题 - 黑屏(FBO、着色器、四边形)