4.OpenGL学习笔记——渲染到纹理

这篇具有很好参考价值的文章主要介绍了4.OpenGL学习笔记——渲染到纹理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写作之处的初衷是作为learnopengl的解释文档,或者代码库来用,不过我慢慢发现这样做挺没意思的,因为learnopengl已经足够详细了,并且随着逐代的更新,我们这个代码库可能还会过时,因此我想还是把一些重要的概念加以巩固,突出,来形成我们自己的特色。

(实际上你看过1-3篇就已经具备了常见OpenGL框架的阅读能力,要实现一些复杂的效果就不得不考虑一些高级的逻辑,而非图形本身)

OK,回到本篇的正题——渲染到纹理

我主要参考这篇文章:
教程14:渲染到纹理 (opengl-tutorial.org)

他已经比较详细,但是讲解中可能还不够清晰(我估计是翻译版本,不太符合中国人的阅读习惯),所以我想把我认为重要的概念和步骤进行介绍和标记。

一、渲染到纹理基本思路

在有别于后台缓冲之外,创建一个可以存储渲染结果的RTV与DSV纹理,用来存储我们希望渲染到纹理的资源。之后可以切换到后台缓冲,创建四边形面片把我们存储的渲染纹理作为纹理资源重新贴图到四边形面片上(可以很灵活的控制贴图位置,甚至于直接输出到后台作为纹理图片)。

二、渲染到纹理基本步骤

1.开辟存储RTV与DSV的帧缓冲内存

    GLuint FramebufferName = 0;
	glGenFramebuffers(1, &FramebufferName);
	glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

2.创建RTV,设置其格式为GL_TEXTURE_2D,并使用一张空的RGB资源图像作为其载体

    GLuint renderedTexture;
	glGenTextures(1, &renderedTexture);
	//RTV格式设置
	glBindTexture(GL_TEXTURE_2D, renderedTexture);
	//设置最后一个参数索引为0的空白图片作为存储RTV的地方
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

3.创建DSV

// The depth buffer
    GLuint depthrenderbuffer;
	glGenRenderbuffers(1, &depthrenderbuffer);
	glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);
	glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 800, 600);
	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);

4.将RTV设置为渲染流水线能访问的资源,占据TEXTURE0的位置,并设置渲染到指定帧缓冲(而非后台)

// 将"renderedTexture"设置为我们布局0号位置来源
	glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);
	// Set the list of draw buffers.
	GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 };
	glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers
    //使用FramebufferName代表我们最开始建立的存储RTV,DSV的容器(使用0默认表示后台)
    glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
	glViewport(0, 0, 800, 600);

注意:glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);

使用GL_COLOR_ATTACHMENT0将renderedTexture的数据存到0#位置上,那么这个0#位置是什么:
layout(location = 0) out vec3 color;

就是我们在渲染纹理的fs中指定布局为0的变量。换句话说,我们将color作为fs的输出,原本是直接放入后台缓冲的,现在定义其输出到布局为0的后台某个存储空间,而这个布局为0的存储空间就是通过GL_COLOR_ATTACHMENT0关联的renderedTexture。也就是说我们给color赋值,实际就是更改renderedTexture。

通过:glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);就实现了渲染到我们规定的纹理空间之中。

对应的fs:

#version 330 core
layout(location = 0) out vec3 color;

void main()
{
	//可以有计算逻辑,取决于需求,不过最终就是给color赋值,存储到我们设置的
    //0#布局颜色空间
	color=vec3(FragColor.xyz);
}

5.正常配置shader,将我们希望的场景渲染到renderedTexture中,也就是到了后台的GL_COLOR_ATTACHMENT0中关联空间(对标TEXTURE0)。换句话说如果这之后你改变TEXTURE0会把之前的结果覆盖掉,这点要注意,所以如果加载纹理要注意。

6.使用渲染出的纹理

1).切换渲染目标

    //将渲染到纹理的资源渲染到屏幕,使用0默认后台
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

2).新一轮渲染(可能涉及改变相机.....)然后,创建四边形面片,使用新的shader,此时要注意使用纹理采样:
fs:

#version 330 core
out vec4 FragColor;
in vec2 UV;
//不需要绑定uniform,因为默认开启0
uniform sampler2D renderedTexture;
void main(){
    FragColor = texture( renderedTexture, UV);
}

还是展示一下vs,方便我们产生逻辑:

#version 330 core
attribute vec3 aPos;
attribute vec2 aUV;
out vec2 UV;
void main()
{
	UV = (aPos.xy+vec2(1,1))/2.0;
	gl_Position=vec4(aPos,1.0f);
}

注意:
1.渲染到纹理的思路是很简单的:增加一个渲染目标,切换流水线渲染目标到我们指定的RTV,将场景渲染到我们指定的纹理中,然后切换回默认(后台渲染目标),把之前渲染得到的纹理作为后续采样的资源对新场景(可以是四边形(相当与一个画布))进行应用。

2.我们存到RTV渲染目标的值可以是RGB值,也可以是深度值,那么就得到一张深度图,可以用来进行Shadow Mapping或者其他(当然教程中也有关于深度纹理的渲染介绍,主要就是参数的配置,这里就不具体介绍了)。

3.要注意渲染循环的使用,正常逻辑:循环开始:切换渲染到纹理——切换纹理到后台——Swap——重新循环开始。文章来源地址https://www.toymoban.com/news/detail-405383.html

到了这里,关于4.OpenGL学习笔记——渲染到纹理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android OpenGL ES 学习(十三) -离屏渲染FBO(截图)RBO, OES转 FBO

    Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投屏 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序 Android OpenGL ES 学习(七) –

    2024年02月12日
    浏览(42)
  • OpenGL —— 2.5、绘制第一个三角形(附源码,glfw+glad)(更新:纹理贴图)

    源码效果   C++源码        纹理图片            需下载stb_image.h这个解码图片的库,该库只有一个头文件。         具体代码:            vertexShader.glsl              fragmentShader.glsl              main.c      

    2024年02月11日
    浏览(50)
  • 纹理贴图和渲染

    纹理映射(也就是纹理图或者叫做纹理贴图)是一种在计算机图形学中常用的技术,它可以将二维的图像(纹理)映射到三维物体的表面上,以增强视觉效果。“atlas”通常是指纹理图集,也就是将多个纹理图放在一张大图上,以便更高效地使用图形硬件。 而“rendering resol

    2024年02月14日
    浏览(46)
  • CG MAGIC进行实体渲染后!分析渲染器CR和VR的区别之处!

    新手小白来说,如何选择渲染器,都会提出疑问? 渲染效果图究竟用CR渲染器还是VR渲染器呢? 今天,CG MAGIC小编通过一个真实的项目场景,实例渲染之后,CR渲染器和VR渲染器区别有哪几点? 1、渲染时间的区别 用同一个项目来比较CR渲染器和VR渲染器时间上的区别。 使用C

    2024年02月10日
    浏览(34)
  • C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记

    视频地址 https://www.youtube.com/watch?v=PH5kH8h82L8list=PLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzgindex=3         接上一篇内容,main.cpp的内容增加了一些代码,显得严谨一些:        然后是Game类的添加了很多内容:         Game.h文件:         Game.cpp文件:        和上一篇相比,在

    2024年02月02日
    浏览(41)
  • 【OpenGL】读取视频并渲染

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍opencv读取视频并在opengl渲染增加3D图形。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 编译: g++ -o video_rendering main.cpp -lglut -lGL -lGLU pkg-config -

    2024年02月12日
    浏览(48)
  • ue4 MRQ渲染器时,媒体纹理播放速度会被加快

    问题描述:当MRQ渲染器开启抗锯齿时,媒体纹理的播放速度会被加快 解决办法:通过执行抗锯齿控制台命令来解决

    2024年02月15日
    浏览(50)
  • 使用OpenGL 和 opengl ES 渲染YUV图片文件的QT示例

    头文件:CPlayWidget.h cpp文件:CPlayWidget.cpp 默认打开 ./test.yuv文件 头文件:CPlayWidget.h  与上面没有差别 cpp文件:只替换了着色器代码:

    2024年01月20日
    浏览(39)
  • 【Unity】Gif图片播放插件(支持UI及模型纹理渲染两种模式)

    unity本身不支持GIF格式文件直接渲染, 因此一般的做法是通过加载图片,通过代码控制其循环播放、停止等,模拟动画效果,本文简单介绍一下某个现有开源工具,感谢开源作者。 1、unity3d Gif图片播放插件 支持移动设备 不需要System.Drawing 2、UnityShowGifDemo 打开项目demo关卡,直

    2024年02月17日
    浏览(62)
  • libVLC 提取视频帧使用OpenGL渲染

    在上一节中,我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象,因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制,利用 GPU 减轻 CPU 计算负荷,本节讲解使用OpenGL来绘制每一帧视频数据。 libVLC 提取视频帧使用QWidget渲染-CSDN博

    2024年04月10日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包