Opengl es 在OpenGL中绘制任意宽度的连续曲线

Opengl es 在OpenGL中绘制任意宽度的连续曲线,opengl-es,drawing,width,line,smooth,Opengl Es,Drawing,Width,Line,Smooth,我想在OpenGL中画一条任意宽度的连续曲线。我正在开发一个触摸屏,通过在旧的X&Y坐标和新的X&Y坐标之间画线,已经达到了预期的效果。当用户在屏幕上滑动手指时,会在手指后面产生一条线。为了确保线条流畅,我使用了以下方法: pGL.glEnable(GL10.GL_LINE_SMOOTH); pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST); 但是,这本质上意味着我无法控制线条的宽度,因为它总是默认为1。因此,我得出结论,我必须想出一些

我想在OpenGL中画一条任意宽度的连续曲线。我正在开发一个触摸屏,通过在旧的X&Y坐标和新的X&Y坐标之间画线,已经达到了预期的效果。当用户在屏幕上滑动手指时,会在手指后面产生一条线。为了确保线条流畅,我使用了以下方法:

pGL.glEnable(GL10.GL_LINE_SMOOTH); 
pGL.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);

但是,这本质上意味着我无法控制线条的宽度,因为它总是默认为1。因此,我得出结论,我必须想出一些其他方法来创造这种效果。

使用四条带或三角形带代替直线,沿笔划居中,并具有所需的宽度

因评论而编辑 使用四边形或三角形绘制粗线的方法如下:

modelview的左上方3×3子矩阵是旋转部分。您希望在屏幕空间中绘制加厚线,即反转局部旋转。为此,需要与modelview旋转方向相反。旋转是正交变换,因此
逆(M)=转置(M)

从技术上讲,我们只对反向投影的Z轴“Z_local”感兴趣。我们可以简单地取modelview矩阵的第三行向量,最后一个元素“w”被设置为零,整个向量被归一化,即

Z_local_i = MV_i,3
接下来我们需要直线切线向量。这与线段之间的方向一样简单。或者更精确地说,如果直线由函数C(t)描述,那么切线是

T=∂C(t)/∂t 
现在我们可以取切线和Z_局部的叉积,得到一个法线

N(t) = Z_local × T(t)
将法向N(t)与C(t)相加,得到一条平行于C的等距曲线。这允许我们绘制四边形:

for t in range(0, T):
    T = deriv(C(t), t)
    N = cross(Z_local, T)
    emit_vertex(C(t) + width*N)
    emit_vertex(C(t) - width*N)

您使用的是OpenGL还是OpenGL ES?哪个版本?这些都会对可能的解决方案产生很大影响。规范中说,当启用线抗锯齿时,支持特定的宽度范围。您想要的宽度是否超出该范围?使用
glGet
GL\u ALIASED\u LINE\u WIDTH\u RANGE
获取平台的值。我相信我使用的是OpenGL ES 1.0。我还没有运行glGet,但我尝试了从1到1000的一系列值,根据指导原则,它应该四舍五入到最接近的支持值,但始终保持在1px。在iPhone上,使用OpenGL ES 1.0,线条绘制支持仅限于1像素宽,正如您已经发现的,您必须“三角化”线条。当然,当你自己做多边形时,消除混叠是不免费的…谢谢你,非常感谢。有一件事,我仍然能够通过使用四边形/三角形条带来实现平滑效果吗?@user908041:是的,或者使用全屏消除混叠(FSAA,多采样缓冲区)。或者你可以只使用一个1D纹理,并向边界方向进行一些衰减。您好,再次感谢您之前的帮助,但我还没有完全弄清楚如何按照您之前的建议沿着笔划绘制三角形条带。在给定笔划的起始X&Y坐标和结束坐标的情况下,您建议我如何进行此操作?非常感谢。非常感谢您如此详细的回复,尽管我尝试创建的四边形/三角形条带仅使用x&y,而不是Z