2017-02-02 2 views
0

ähnlich den simpleVideoFilter und Gesichtserkennung, würde Ich mag einen Teil meines GPUImage2 Video-Feeds mit farbigen Rechtecken markieren. Der SolidColorGenerator scheint mit zwei Ausnahmen ein guter Anfang zu sein. Zunächst bin ich mir nicht sicher, wie ich die SolidColorGenerator-Ausgabe an die richtige Stelle in meinem Originalbild transponiere. Zweitens bin ich mir nicht sicher, wie ich meinem ursprünglichen Bild N Rechtecke hinzufügen kann. In der Zwischenzeit hatte ich Erfolg mit dem LineGenerator, aber ich denke, ein Rechteck würde besser aussehen.GPUImage2 verwendet SolidColorGenerator als RectangleGenerator

Bonus: Rechtecke mit abgerundeten Ecken und einem einzelnen Pixel Grenze.

enter image description here

Antwort

0

Was für mich gearbeitet wurde eine RectangleGenerator zu schreiben. Der Schlüssel zum neuen RectangleGenerator war das Zeichnen von GL_TRIANGLES.

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

Eine Optimierung, die gemacht werden könnte, wäre GL_Elements und GL_TRIANGLE_STRIP zu verwenden, obwohl ich nicht in der Lage war, um das herauszufinden.

enter image description here

Die vollständige Lösung sollte Grenze, und bordercorner unterstützen. Für jetzt genügen einfache Rechtecke. Der vollständige Code unten.

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() 
} 
} 

Glücklich Coding

Verwandte Themen