OpenGL(ES 2.0)动态更改线宽

3

我现在正在使用大量的GL_LINES,它们都有统一的半径,来绘制我的模型。我知道glLineWidth会改变所有线条的半径,但每条线条应该具有不同的半径。我想知道是否可以使用glLineWidth(以不同方式)或另一个函数来实现?还有其他方法吗?

1个回答

8
将它们呈现为特殊构造的三角形带。具体来说,将每个线段渲染为一对三角形,形成一个四边形,四边形的长度与线段的长度相匹配,宽度与您的“半径”匹配。然而,真正的诀窍在于模拟GL_LINES,因为线段不一定要连接在一起。在三角形带情况下,为了实现这一点,您需要使用零面积三角形连接三角形对,这不会被渲染(除非您的OpenGL ES实现不符合规范)。
例如,假设我们处于2D(为简单起见;3D几乎相同),假设您的线段之一具有端点(x1,y1)和(x2,y2),宽度为W,如下所示。
line segment
要用四边形替换它,我们需要确定角落的坐标,这需要一些数学知识。对于适当的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集渲染为单个三角形带。


我不确定你所说的“退化三角形”是什么意思,而且添加第z个坐标并不容易。仅仅添加第z个坐标会给我一个长方体,但是如何获得圆柱体所具有的曲率呢? - user1989149
1
一个“退化三角形”是指其中三个顶点中有两个是相同的。因此,它的面积为零,不会被光栅化。它们通常用于在单个绘制调用中呈现断开的三角形带。 - radical7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接