Swift GPUImage2将SolidColorGenerator用作矩形生成器

Swift GPUImage2将SolidColorGenerator用作矩形生成器,swift,face-detection,gpuimage,Swift,Face Detection,Gpuimage,与simpleVideoFilter和人脸检测类似,我想用彩色矩形突出显示我的GPUImage2视频提要的一部分。SolidColorGenerator似乎是一个良好的开端,但有两个例外。首先,我不确定如何将SolidColorGenerator输出转置到原始图像的正确位置。第二,我不确定如何添加N个矩形到我的原始图像。与此同时,我成功地使用了LineGenerator,但我认为矩形看起来会更好 奖金: 具有圆角和单像素边框的矩形 对我有用的是编写一个矩形生成器。新矩形生成器的关键是绘制GL_三

与simpleVideoFilter和人脸检测类似,我想用彩色矩形突出显示我的GPUImage2视频提要的一部分。SolidColorGenerator似乎是一个良好的开端,但有两个例外。首先,我不确定如何将SolidColorGenerator输出转置到原始图像的正确位置。第二,我不确定如何添加N个矩形到我的原始图像。与此同时,我成功地使用了LineGenerator,但我认为矩形看起来会更好

奖金: 具有圆角和单像素边框的矩形


对我有用的是编写一个矩形生成器。新矩形生成器的关键是绘制GL_三角形

glDrawArrays(GLenum(GL_TRIANGLES), 0, GLsizei(positions.count) * 2)
可以进行的一个优化是使用GL_元素和GL_三角形条,尽管我无法理解这一点

完整的解决方案应支持边界、边界宽度和拐角半径。现在,简单的矩形就足够了。完整代码如下

let vertex = "attribute vec4 position; void main(){ gl_Position = position; }"

let fragment = "uniform lowp vec3 fillColor; void main(){ gl_FragColor = vec4(fillColor, 1.0); }"

public class RectangleGenerator: ImageGenerator {

let rectangleShader:ShaderProgram
var uniformSettings = ShaderUniformSettings()

public var fillColor:Color = Color.green { didSet { uniformSettings["fillColor"] = fillColor } }

public override init(size:Size) {
    rectangleShader = crashOnShaderCompileFailure("RectangleGenerator"){try sharedImageProcessingContext.programForVertexShader(vertex, fragmentShader:fragment)}
    super.init(size:size)

    ({fillColor = Color.green})()
}

public func renderRectangles(_ positions:[Position]) {
    guard positions.count > 3 else { return }

    imageFramebuffer.activateFramebufferForRendering()

    rectangleShader.use()
    uniformSettings.restoreShaderSettings(rectangleShader)
    clearFramebufferWithColor(Color.transparent)

    guard let positionAttribute = rectangleShader.attributeIndex("position") else { fatalError("A position attribute was missing from the shader program during rendering.") }

    let convertedPositions = positions.flatMap{$0.toGLArray()}
    glVertexAttribPointer(positionAttribute, 2, GLenum(GL_FLOAT), 0, 0, convertedPositions)

    glBlendEquation(GLenum(GL_FUNC_ADD))
    glBlendFunc(GLenum(GL_ONE), GLenum(GL_ONE))
    glEnable(GLenum(GL_BLEND))

    glDrawArrays(GLenum(GL_TRIANGLES), 0, GLsizei(positions.count) * 2)
    glDisable(GLenum(GL_BLEND))

    notifyTargets()
}
}
快乐编码