如何在 openGL ES 2.0 中执行 2 遍以获得模糊效果

2024-03-15

为了创建模糊效果,理论上需要创建 2 个顶点着色器,一个用于水平通道,第二个用于垂直通道。然后使用一个片段着色器进行实际采样。

我的问题是,如何实际执行 2 个顶点着色器?我是否需要渲染,然后通过 glReadPixels 返回像素,然后再次渲染?

我的环境是Android,OpenGL ES 2.0

Thanks


您可以将第一个通道渲染到 FBO,然后在将第二个通道渲染到默认帧缓冲区时使用生成的纹理。

如果您要模糊的图像位于具有名称的纹理中inputTexId,以下是代码外观的概述。您没有指定是使用 C++ 还是 Java。下面使用 C++ 绑定,但在 Java 中看起来非常相似。

一旦在设置过程中,您创建了一个 FBO 和一个将用于包含第一个渲染通道结果的纹理:

GLuint pass1TexId = 0;
glGenTextures(1, &pass1TexId);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
             GL_RGB, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, pass1TexId, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

每次您想要应用模糊滤镜时,您都可以使用此 FBO 作为第一个渲染通道的渲染目标,并将原始图像作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glBindTexture(GL_TEXTURE_2D, inputTexId);
// Set up shaders and state for first blur pass, and render.

然后,对于第二遍,渲染到默认帧缓冲区,并使用第一遍生成的纹理作为输入:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, pass1TexId);
// Set up shaders and state for second blur pass, and render.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 openGL ES 2.0 中执行 2 遍以获得模糊效果 的相关文章

随机推荐

  • 无法加载文件或程序集“Microsoft.Office.Interop.Excel,版本=14.0.0.0”

    我有一个使用 MS Excel 文件读 写的网站 我将相关的 dll 添加到网站的 Bin 文件夹中 它在我的本地主机上运行得很好 我想是因为我在我的电脑上安装了 MS Excel 2010 但是当我将其上传到远程电脑并运行该网站时 它会抛
  • 设计模式 - Objective-C - MVC 模型视图控制器

    您好 我已经阅读了网上有关 MVC 的教程 并且已经阅读了此处的主题 我想我已经了解了 MVC 的概念 但我不确定它的实现 我尝试将其应用于一个简单的程序 一个带有标签和按钮的窗口 该按钮增加一个计数器 标签显示它的值 我尝试了两种不同的方
  • 如何运行命名空间内的 JavaScript 函数

    如果我有类似的东西 App editingMode function function setEditingMode entityID editingMode val 1 ajax type POST url Organisations M
  • 如何控制CVS存储库中的文件权限?

    目前 一些用户的 umask 设置方式导致对常规文件的执行权限 我想避免 有没有办法强制所有签入的文件只能被读取 但有一些例外 在 CVS 中处理此问题的推荐方法是什么 Cvs 命令选项 watch 也会阻止恢复文件权限 如果观看 则检出文
  • 使用不带标签的 Git 描述

    我有一个存储库 当我运行时它只给我一个哈希值git describe 直到今天我才知道它这样做是因为 always选项 这就是我正在使用的 因为该存储库没有标签 我有另一个包含很多标签的存储库 我该如何使用git describe排除标签并
  • Mysql 选择不在表中的位置

    我有 2 个表 A 和 B 具有相同的主键 我想选择 A 中而不是 B 中的所有行 以下方法有效 select from A where not exists select from B where A pk B pk 但看起来很糟糕 A
  • Oracle Select IN 参数中的多个字段

    Select FROM STUDENT WHERE student course student major IN SELECT schedule course schedule major FROM schedule 如果我必须提供静态值
  • defaultCalendarForNewEvents 失败

    当我尝试调用 newEventStore defaultCalendarForNewEvents 时 它返回一条错误消息 707 907 defaultCalendarForNewEvents failed Error Domain EKC
  • 实现具有多重继承的纯虚函数

    假设有这样一个接口 class A public virtual foo 0 还有一个班B它实现了这个接口 class B public A public virtual foo Foo implemented by B 终于有一节课了C有
  • 根据选定的<选项>动态更新表单操作

    所以 这就是我想要做的 我想要一个 HTML 格式的下拉列表 其中包含一个根据下拉列表的值而变化的提交按钮 所以 当我有这个时
  • MediaWiki 类别不会自动更新

    我有一个MediaWiki在 Linux 服务器上运行的实例似乎不会在提交页面编辑时自动更新其类别 我从未在我使用过的任何其他维基上看到过这一点 所以我想知道是否有一些脚本配置不正确 定期运行rebuildAll php or refres
  • 如何将 XAML 转换注入到我的构建中?

    我想针对我的 XAML 资源字典运行自定义 EXE 假设我得到的这个 exe 将删除注释 空格和未使用的资源 原始 XAML 文件需要保持不变 但最终出现在 XAP 和 DLL 中的 XAML silverlight 和 BAML wpf
  • 使用 Detected Idiom 实现 is_destructible

    这是我的实现is destructible v https en cppreference com w cpp types is destructible template
  • Javascript 警报在页面显示之前加载

    在我的手机上 在 Safari 中如果我转到默认页面alert Hello 在正文 onload 事件中 警报显示 我的默认页面在后台完全可见 如果我随后转到另一个网站 例如 bbc co uk 然后在地址栏中输入默认页面的网址 则警报会在
  • 为什么 Docker Django 管理员崩溃并显示代码 245

    我正在 OSX 10 15 3 上使用 runserver 运行 Django 版本 3 0 3 使用我的应用程序没有问题 但是当我尝试访问时http localhost 8000 admin http localhost 8000 adm
  • Web Api - 如何检测响应何时完成发送

    在 Web api 方法中 我生成一个文件 然后将其流式传输到响应 如下所示 public async Task
  • NSUserDefaults standardUserDefaults 不适用于扩展

    我将应用程序组添加到开发人员门户中的应用程序 ID 并在我的配置文件中使用该应用程序 ID 我在 Xcode 中的产品标识符设置为该应用程序 ID 在我的应用程序委托中 我从 didFinishLaunchingWithOptions 中调
  • 在Python中捕获imaplib异常(使用IMAPClient包)

    我正在使用外部库 IMAPClient 当登录失败时 我看到以下错误 imaplib error AUTHENTICATIONFAILED Authentication failed 当我尝试时except imaplib error 我得
  • 将 IAsyncEnumerable 转换为列表

    所以在 C 8 中我们添加了IAsyncEnumerable界面 如果我们有一个正常的IEnumerable我们可以做一个List或者我们想要从中得到的几乎任何其他集合 感谢那里的 Linq var range Enumerable Ran
  • 如何在 openGL ES 2.0 中执行 2 遍以获得模糊效果

    为了创建模糊效果 理论上需要创建 2 个顶点着色器 一个用于水平通道 第二个用于垂直通道 然后使用一个片段着色器进行实际采样 我的问题是 如何实际执行 2 个顶点着色器 我是否需要渲染 然后通过 glReadPixels 返回像素 然后再次