• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - OpenGL-ES:选择性混合

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:10:54 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 GPUImage 的角点检测器从相机捕获的帧中提取角点。我想在角落坐标处渲染 Spark 。当我得到角坐标后,我将它传递给我的 Spark 生成器(非常类似于 GPUImage 的十字准线生成器):

public func renderSparkles(_ positions:[Position]) {
    imageFramebuffer.activateFramebufferForRendering()
    imageFramebuffer.timingStyle = .stillImage

    glEnable(GLenum(GL_POINT_SPRITE_OES))

    sparklesShader.use()
    uniformSettings.restoreShaderSettings(sparklesShader)

    clearFramebufferWithColor(Color.transparent)

    guard let positionAttribute = sparklesShader.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)
    glDrawArrays(GLenum(GL_POINTS), 0, GLsizei(positions.count))

    notifyTargets()
}

在生成器的片段着色器中,我在角坐标处绘制闪光:

uniform lowp vec3 crosshairColor; 
varying highp vec2 centerLocation;

void main()
{
   lowp vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy);

   lowp float r = length(distanceFromCenter)*0.042; 
   lowp float a = atan(distanceFromCenter.y,distanceFromCenter.x);      
   lowp float f = abs(cos(a*2.0))*0.100*-0.322/0.224;
   lowp float b = abs(cos(a*2.0))*0.078*-0.882/17.088;
   lowp float c = abs(cos(a*2.0))*0.030*-0.178*0.688;

   lowp vec4 color = vec4(1.0-smoothstep(f,b+0.04,r)) + vec4(1.0-smoothstep(b,c+0.02,r/0.644)) + vec4(1.0-smoothstep(b,c+0.011,r/0.764));
   gl_FragColor = color;
}

Here is an example of output I've got

我怎样才能混合闪光?



Best Answer-推荐答案


如果其他人觉得有帮助,这里是基于 Rabbid76 建议的渲染 sparkles 方法的代码:

public func renderSparkles(_ positions:[Position]) {
    imageFramebuffer.activateFramebufferForRendering()
    imageFramebuffer.timingStyle = .stillImage

    glEnable(GLenum(GL_POINT_SPRITE_OES))

    glEnable(GLenum(GL_BLEND))
    glBlendFunc(GLenum(GL_SRC_ALPHA),GLenum(GL_ONE_MINUS_CONSTANT_ALPHA))

    sparklesShader.use()
    uniformSettings.restoreShaderSettings(sparklesShader)

    clearFramebufferWithColor(Color.transparent)

    guard let positionAttribute = sparklesShader.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)
    glDrawArrays(GLenum(GL_POINTS), 0, GLsizei(positions.count))

    notifyTargets()   
}

关于ios - OpenGL-ES:选择性混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50157974/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap