3

我目前正在绘制我的模型,使用一吨的GL_LINES所有在一个统一的半径。我知道这glLineWidth会改变所有线的半径,但它们每个都应该有不同的半径。我想知道它是否可以使用glLineWidth(以不同的方式)或其他功能?我还应该怎么做?

4

1 回答 1

8

将它们渲染为特殊构造的三角形条带。具体来说,将每个线段渲染为一对三角形以形成四边形,四边形的长度与线的长度相匹配,宽度与您的“半径”相匹配。然而,真正的技巧是模拟 GL_LINES,因为线段不一定必须相互连接。要在三角形条带的情况下执行此操作,您需要将三角形对与一个不会被渲染的零面积三角形连接起来(除非您的 OpenGL ES 实现不兼容)。

例如,假设我们在 2D 中(为简单起见;3D 几乎相同)假设您的一条线段具有端点 (x1,y1) 和 (x2,y2),宽度为 W,如下所示。
线段
要将其替换为四边形,我们需要确定角的坐标,这需要一些数学知识。对于合适的二维向量类,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

这提供了将单线变成四边形的解决方案。要将它们连接在一起,我们需要创建其中包含退化三角形的三角形带。如果我们将其绘制为 using glDrawElements,我们可以构造一个简单的索引数组来执行此操作。假设我们如上所述将两条线转换为四边形,给我们顶点 v[0] ... v[7]。要将它们制成一个三角形条带,请制作一个索引列表

{ 0, 1, 2, 3, 3, 4, 5, 6, 7 }

通过在列表中重复两次“3”,我们创建了一个新的三角形,将其他三角形连接在一起,但没有出现。如果重复四边形的最后一个顶点,则可以将整个 GL_LINES 集渲染为单个三角形条带。

于 2013-01-25T04:48:58.767 回答