OpenGL (ES 2.0) 动态改变线宽
Posted
技术标签:
【中文标题】OpenGL (ES 2.0) 动态改变线宽【英文标题】:OpenGL (ES 2.0) Dynamically Change Line Width 【发布时间】:2013-01-08 23:42:57 【问题描述】:我现在正在使用大量的GL_LINES
绘制我的模型,所有这些都在一个统一的半径上。我知道glLineWidth
会改变 all 线的半径,但它们每个都应该有不同的半径。我想知道是否可以使用glLineWidth
(以不同的方式)或其他功能?我该怎么办?
【问题讨论】:
【参考方案1】:将它们渲染为特殊构造的三角形条带。具体来说,将每条线段渲染为一对三角形以形成四边形,四边形的长度与线的长度相匹配,宽度与您的“半径”相匹配。然而,真正的技巧是模拟 GL_LINES,因为线段不一定必须相互连接。要在三角形带的情况下执行此操作,您需要将三角形对与一个面积为零的三角形连接起来,该三角形不会被渲染(除非您的 OpenGL ES 实现不符合要求)。
例如,假设我们在 2D 中(为简单起见;3D 几乎相同)假设您的一条线段具有端点 (x1,y1) 和 (x2,y2),宽度为 W,如下所示.
要将其替换为四边形,我们需要确定角的坐标,这需要一些数学知识。对于合适的 2D 矢量类,vec2
vec2 p1(x1, y1);
vec2 p2(x2, y2);
vec2 v = p2 - p1;
v /= v.length(); // make it a unit vector
vec2 vp(-v.y, v.x); // compute the vector perpendicular to v
vec2 v[4];
v[0] = p1 + W/2 * vp;
v[1] = p1 - W/2 * vp;
v[2] = p2 + W/2 * vp;
v[3] = p2 - W/2 * vp;
// Load the v[] array into a vertex-buffer object
这提供了将单行变成四边形的解决方案。要将它们连接在一起,我们需要创建带有 退化三角形 的三角形带。如果我们将其绘制为使用glDrawElements
,我们可以构造一个简单的索引数组来执行此操作。假设我们如上所述将两条线转换为四边形,给我们顶点 v[0] ... v[7]。要将它们制成一个三角形条带,请制作一个索引列表
0, 1, 2, 3, 3, 4, 5, 6, 7
通过在列表中重复两次“3”,我们创建了一个新三角形,将其他三角形连接在一起,但不会出现。如果重复四边形的最后一个顶点,则可以将整个 GL_LINES 集渲染为单个三角形条带。
【讨论】:
我不确定你所说的 退化三角形 是什么意思,并且为此添加 zth 坐标并非易事。只需添加一个 zth 坐标就可以得到一个直角棱镜,但我怎样才能得到圆柱体的曲率呢? 退化三角形是三个顶点中的两个相同的三角形。因此,它的面积为零,不会被光栅化。它们通常用于在单个绘图调用中渲染断开的三角形条带。以上是关于OpenGL (ES 2.0) 动态改变线宽的主要内容,如果未能解决你的问题,请参考以下文章
如何将变量(不统一)浮点值从 C++ 传递到顶点着色器 OpenGL ES 2.0
IOS:OpenGL ES 2.0 与 3.0 中动态分支着色器的性能
OPENGL ES 2.0 知识串讲――OPENGL ES 2.0 概括