OpenGL(ES 2.0)动态更改线宽

use*_*149 3 opengl-es dynamic line width

我现在正在绘制我的模型,使用大量GL_LINES均匀的半径.我知道这glLineWidth会改变所有线条的半径,但它们每个都应该有不同的半径.我想知道它是否可能使用glLineWidth(以不同的方式)或其他功能?我该怎么办呢?

rad*_*al7 8

将它们渲染为特殊构造的三角形条带.具体来说,将每个线段渲染为一对三角形以形成四边形,四边形的长度与线的长度匹配,宽度与"半径"匹配.然而,真正的技巧是模拟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
Run Code Online (Sandbox Code Playgroud)

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

{ 0, 1, 2, 3, 3, 4, 5, 6, 7 }
Run Code Online (Sandbox Code Playgroud)

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

  • _简并三角形_是三个顶点中的两个相同的三角形。因此,它的面积为零,并且不会被光栅化。它们通常用于在单个绘制调用中渲染断开连接的三角形带。 (2认同)