使用GL_POINTS(iOS)使用Open GL改变线宽

时间:2016-02-25 19:54:58

标签: ios swift opengl-es vertex-buffer

我正在使用swift(基于GLPaint)和open 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)
}

每1/60秒调用一次render()。

着色

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;
}

提前致谢!

2 个答案:

答案 0 :(得分:0)

在顶点着色器中,将gl_pointSize设置为所需的宽度。该测量值采用帧缓冲像素,因此如果帧缓冲区的大小随设备的比例因子而变化,则需要适当调整点大小。

答案 1 :(得分:0)

如果您找到一种方法来控制顶点着色器中的线宽,那么它很可能是最佳解决方案。不仅线条具有不同的宽度,而且甚至单条线可能在点之间具有增加的宽度(内插)。我不确定你是否能够在你的平台上实现这一目标。

因此,如果您确实找到了一种方法,您可以将点大小添加到缓冲区,并将其与顶点着色器中的新属性一起使用。

如果不是,您将需要使用三角形绘制线条,这通常是更好的做法。要定义点AB之间的顶点,您可以将法线设为W = (B-A).normalized()normal = N = (W.y, -W.x)。然后,4个职位是k = lineWidth/2.0t1 = A + N*kt2 = A - N*kt3 = B + N*kt4 = B - N*k。因此,这是您添加到缓冲区中的内容,并根据您要查找的内容绘制为三角形条或三角形。