[英]Varying Line Width with Open GL using GL_POINTS (iOS)
我正在使用swift(基于GLPaint)并打开gl创建绘图应用程序。 现在,我想改善曲线,使其随冲程速度变化(例如,如果快速绘制,则变粗)
但是,由于我对open gl的了解非常有限,因此我需要一些指导。 我要做的是为我计算并添加到屏幕上的每个CGPoint更改纹理/点的大小。 可能吗?
func addQuadBezier(var from:CGPoint, var ctrl:CGPoint, var to:CGPoint, startTime:CGFloat, endTime:CGFloat) {
scalePoints(from: from, ctrl: ctrl, to: to)
let pointCount = calculatePointsNeeded(from: from, to: to, min: 16.0, max: 256.0)
var vertexBuffer: [GLfloat] = [GLfloat](count: Int(pointCount), repeatedValue:0.0)
var t : CGFloat = startTime + 0.0002
for i in 0..<Int(pointCount) {
let p = calculatePoint(from:from, ctrl: ctrl, to: to)
vertexBuffer.insert(p.x.f, atIndex: i*2)
vertexBuffer.insert(p.y.f, atIndex: i*2+1)
t += (CGFloat(1)/CGFloat(pointCount))
}
glBufferData(GL_ARRAY_BUFFER.ui, Int(pointCount)*2*sizeof(GLfloat), vertexBuffer, GL_STATIC_DRAW.ui)
glDrawArrays(GL_POINTS.ui, 0, Int(pointCount).i)
}
func render()
{
context.presentRenderbuffer(GL_RENDERBUFFER.l)
}
其中render()每1/60秒调用一次。
着色器
attribute vec4 inVertex;
uniform mat4 MVP;
uniform float pointSize;
uniform lowp vec4 vertexColor;
varying lowp vec4 color;
void main()
{
gl_Position = MVP * inVertex;
gl_PointSize = pointSize;
color = vertexColor;
}
提前致谢!
在您的顶点着色器中,将gl_pointSize
设置为所需的宽度。 该测量以帧缓冲像素为单位,因此,如果帧缓冲的大小随设备的比例因子而变化,则需要适当调整点大小。
如果找到一种方法来控制顶点着色器中的线宽,则很可能是最佳解决方案。 不仅线条的宽度会有所不同,甚至单条线在点之间的宽度也会有所增加(插值)。 我不确定您是否可以在您的平台上实现此目标。
因此,如果确实找到了一种方法,可以将点大小添加到缓冲区中,并将其与顶点着色器中的新属性一起使用。
如果不是这样,您将需要使用三角形画线,这通常是一种更好的做法。 要定义点A
和B
之间的顶点,可以将法线设为W = (BA).normalized()
, normal = N = (Wy, -Wx)
。 然后这4个位置是k = lineWidth/2.0
, t1 = A + N*k
, t2 = A - N*k
, t3 = B + N*k
, t4 = B - N*k
。 因此,这就是您添加到缓冲区中的内容,并根据要查找的内容绘制为一个或多个三角形条。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.