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 渲染为八边形 [重复]的主要内容,如果未能解决你的问题,请参考以下文章