gpt4 book ai didi

swift - GPUImage2使用SolidColorGenerator作为矩形生成器

转载 作者:行者123 更新时间:2023-11-30 12:43:14 25 4
gpt4 key购买 nike

与 simpleVideoFilter 和人脸检测类似,我想用彩色矩形突出显示 GPUImage2 视频源的一部分。 SolidColorGenerator 似乎是一个好的开始,但有两个异常(exception)。首先,我不确定如何将 SolidColorGenerator 输出转置到原始图像上的正确位置。其次,我不确定如何将 N 个矩形添加到我的原始图像中。与此同时,我已经成功使用了 LineGenerator,但我认为矩形看起来会更好。

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

enter image description here

最佳答案

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

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

可以进行的一个优化是使用 GL_Elements 和 GL_TRIANGLE_STRIP,尽管我无法弄清楚这一点。

enter image description here

完整的解决方案应该支持 border、borderWidth 和cornerRadius。现在简单的矩形就足够了。完整代码如下。

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

快乐编码

关于swift - GPUImage2使用SolidColorGenerator作为矩形生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com