美文网首页
OpenGL 链式滤镜(帧缓冲离屏渲染)

OpenGL 链式滤镜(帧缓冲离屏渲染)

作者: jasperWhf | 来源:发表于2023-03-22 18:18 被阅读0次

一、链式滤镜概念

链式滤镜 通过帧缓冲离屏渲染技术实现特效的组合和叠加。通过多次draw最终实现预期效果。

二、渲染流程中的帧缓冲

OpenGL的工作流程,输入像素数据和顶点数据,两种数据分别操作后,通过光栅化,得到片段,再经过片段处理,最后绘制到帧缓冲区,最终转化为像素数据。OpenGL 管线渲染的最终目的地就是FrameBuffer(帧缓冲)。下面是OpenGL渲染流程图。

三、帧缓冲对象

在OpenGL渲染管线中,几何数据和纹理经过多次转化和多次测试,最后以二维像素的形式显示在屏幕上。OpenGL管线的最终渲染目的地被称作帧缓存(framebuffer)。帧缓冲是一些二维数组和OpenG所使用的存储区的集合:颜色缓存、深度缓存、模板缓存和累计缓存。一般情况下,帧缓存完全由window系统生成和管理,由OpenGL使用。这个默认的帧缓存被称作“window系统生成”(window-system-provided)的帧缓存。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。在一个帧缓存对象中有多个颜色关联点、一个深度关联点,和一个模板关联。每个帧缓存中至少有一个颜色关联点,其数目与实体显卡相关。可以通过GL_MAX_COLOR_ATTACHMENTS_EXT来查询颜色关联点的最大数目。

需要注意:FBO中并没有存储图像,只有多个关联点。

四、自定义帧缓冲

1:创建一个帧缓冲.

unsignedintfbo;glGenFramebuffers(1,&fbo);

2:绑定帧缓冲,帧缓冲会在被绑定时隐士开启

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

3:渲染到纹理

glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

五、渲染链条

多个特效组合结构如下,绑定frame buffer 0 作用是再次激活默认帧缓冲,在主窗口中有视觉效果。

1:灰度 fragment shaderGray

precision highp float; uniform sampler2D Texture; 

varying vec2 TextureCoordsVarying; 

const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);

void main (void) { 

 vec4 mask = texture2D(Texture, TextureCoordsVarying); 

 floatluminance = dot(mask.rgb, W); 

 gl_FragColor = vec4(vec3(luminance), 1.0); 

}

1:上下颠倒 fragment shaderReverse

//setp two 

DrawWithGrayInShaderReverse(texture)

precision highp float;

uniform sampler2D Texture;

varying vec2 TextureCoordsVarying;

void main (void) {

    vec4 color = texture2D(Texture, vec2(TextureCoordsVarying.x, 1.0 - TextureCoordsVarying.y));

    gl_FragColor = color;

}

伪代码如下:

// Step one

unsigned int fbo;

glGenFramebuffers(1, &fbo);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

unsigned int texture;

glGenTextures(1, &texture);

glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

DrawShaderGray(); //绘制结果在texture

//setp two 

DrawWithGrayInShaderReverse(texture)

相关文章

  • OpenGL 链式滤镜(帧缓冲离屏渲染)

    OpenGL 编写特效在部分应用中可通过单个shader实现,即通过修过修改顶点着色器或片元着色器实现。但更多的场...

  • 离屏渲染

    离屏渲染定义 所有渲染操作将渲染到当前绑定的帧缓冲的附加缓冲中,由于我们的帧缓冲不是默认的帧缓冲,渲染命令对窗口的...

  • 离屏渲染,OpenGL的三种渲染方式

    一. 离屏渲染触发的原理:APP在对图片进行渲染,合并的时候会触发离屏渲染,离屏渲染流程先把图层保存在帧缓冲区(o...

  • OpenGL ES手册翻译---4.每块碎片的操作和帧缓冲(三)

    4.4 帧缓冲对象 如同第一章和第二章描述的一样,OpenGL ES渲染到帧缓冲(和从帧缓冲中读取)。OpenGL...

  • iOS触发离屏渲染

    在OpenGL中,GPU有2种渲染方式 离屏渲染消耗性能的原因需要创建新的缓冲区离屏渲染的整个过程,需要多次切换上...

  • iOS离屏渲染

    正常渲染与离屏渲染 正常渲染流程 :图像经过CPU解密后,由GPU渲染到帧缓冲区(FrameBuffer),然后扫...

  • 离屏渲染(Offscreen Rendering)

    直接将图层合成到帧的缓冲区中离屏渲染离屏渲染可以被 Core Animation 自动触发,或者被应用程序强制触发...

  • iOS下对离屏渲染的理解

    离屏渲染定义 离屏渲染的流程如图: GPU把渲染好的的内容存放到离屏渲染缓冲区中,在离屏渲染缓冲区(Offscre...

  • 离屏渲染

    什么叫离屏渲染: 当GPU无法直接把渲染结构写入帧缓冲区,而是先创建一个临时的区域,之后再写入帧缓冲区,这个过程叫...

  • OpenGL的帧缓冲

    昨天终于把OpenGL的帧缓冲给看完了。让帧缓冲外加一些比较好的滤镜着色器,比如“反相”滤镜,就能做出很多有趣的全...

网友评论

      本文标题:OpenGL 链式滤镜(帧缓冲离屏渲染)

      本文链接:https://www.haomeiwen.com/subject/qmlbrdtx.html