前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Vulkan 渲染写一个 Android GPUImage

用 Vulkan 渲染写一个 Android GPUImage

作者头像
音视频开发进阶
发布2021-03-13 20:04:48
7140
发布2021-03-13 20:04:48
举报

说的 GPUImage 相信大家都不陌生,GPUImage 是做滤镜、渲染、特效最主流的框架之一,被广泛应用在短视频应用中。

GPUImage 目前还是采用 OpenGL 进行渲染的,可随着技术的发展进步,iOS 系统都开始抛弃 OpenGL 拥抱 Metal 了,Android 也推出了 Vulkan 渲染机制。

关于 Vulkan ,大家可能会有点陌生,它和 OpenGL 一样也是跨平台的渲染接口,就是学习成本高了一点,调用流程麻烦了一点,但还是可以掌握的~~~

而且一旦掌握了 Vulkan, 再去看 Metal ,或者 Windows 平台下的 Direct3D,就会发现它们有很多共通之处的,很多概念都是可以互相借鉴的,就好比编程语言一样,掌握了 Kotlin 再去看 Swift 感觉就傻傻分不清楚了。

这次要介绍的就是用 Vulkan 实现一个 Android GPUImage 了。

我已经实现了大部分的代码,组建了基本的渲染链机制,复刻了一些特效,具体可以看代码详情:

代码地址如下,欢迎 Star !!!

https://github.com/glumes/Vulkan-GPUImage

想要后续添加特效也是非常方便的,以曝光特效为例:

代码语言:javascript
复制
static const char *shader =
        "#version 400\n"
        "#extension GL_ARB_separate_shader_objects : enable\n"
        "#extension GL_ARB_shading_language_420pack : enable\n"
        "layout (binding = 0) uniform sampler2D tex;\n"
        "layout (location = 0) in vec2 texcoord;\n"
        "layout (location = 0) out vec4 uFragColor;\n"
        "layout (push_constant) uniform exposure {\n"
        " float exposure;\n"
        "} pushVals;\n"
        "void main() {\n"
        "    vec4 textureColor = texture(tex,  texcoord); \n"
        "   uFragColor = vec4(textureColor.rgb * pow(2.0,pushVals.exposure),textureColor.w);\n"
        "}";

class ExposureFilter : public VulkanFilter {

public:
    ExposureFilter() : VulkanFilter() {
        pFragShader = shader;
        pushConstant.resize(1);
        pushConstant[0] = exposure;
    }

    virtual void setProcess(uint32_t process);

protected:

private:
    float exposure = 1.0f;
};

首先实现对应的 Shader ,然后对应特效类继承自 VulkanFilter,如果特效没有需要更新的参数,可以不用 pushConstant 。

如果有的话把 pushConstant 的长度修改为参数的个数,每个参数对应 shader 中推送常数的值即可。

然后在 setProcess 里面修改对应的 pushConstant 值:

代码语言:javascript
复制
void ExposureFilter::setProcess(uint32_t process) {
    pushConstant[0] = FilterUtil::getProcess(process,-10.0f,10.0f);
}

在应用中拖动 SeekBar ,就可以更改对应的常量值了,从而修改 Shader 效果,对于简单的特效,基本上不用五分钟就可以添加一个新的效果了,很多封装工作都放在 VulkanFilter 里面了。

在实现上采用的是多 RenderPass 的方式,其实也可以用多 Subpass 的方式,但是不好做效果切换,干脆就多 RenderPass 了,其实也可以两者混合。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档