【一步步学OpenGL(35)】 -《延迟渲染(一)》

教程 34

延迟渲染(一)

在这里插入图片描述

原文: http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html

CSDN完整版专栏: https://blog.csdn.net/cordova/article/category/9266966


理论介绍

从教程17开始我们的光照计算渲染路径都是前向渲染。前向渲染是一种最直接的光照计算渲染路径,我们在VS中对每个物体的顶点做一系列的变换(主要是将顶点位置和法线变换到裁剪空间),然后在FS中对每个像素进行光照计算。由于每个物体上的每个像素只会调用一次FS,因此对于每个FS我们要传入所有的光源数据并计算每个光源的效果。这种方式很简单,但是有弊端。当一个场景非常复杂,现在大型游戏场景都十分复杂,会有大量的物体以及复杂的深度,每个像素可能被多个物体重叠覆盖,

我在示例代码中申请了一个帧缓存对象: ``` int FrameBuf; glGenFramebuffers(1, &FrameBuf); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FrameBuf); ``` 三个渲染缓存对象,第1个和第3个分别绑定为帧缓存对象的COLOR_ATTACHMENT0和COLOR_ATTACHMENT1,第2个绑定到帧缓存对象的DEPTH_ATTACHMENT: ``` glGenRenderbuffers(3, RendBuf); glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[0]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 200, 200); glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[1]); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 200, 200); glBindRenderbuffer(GL_RENDERBUFFER, RendBuf[2]); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 200, 200); ``` 设置绑定点: ``` glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, RendBuf[0]); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, RendBuf[1]); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, RendBuf[2]); ``` 然后在绘制到帧缓存对象中: ``` glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FrameBuf); glViewport(0, 0, 200, 200); GLenum bufs[2] = { GL_COLOR_ATTACHMENT0 , GL_COLOR_ATTACHMENT1}; glDrawBuffers(2, bufs); glBindVertexArray(vert); glEnable(GL_DEPTH_TEST); glDrawArrays(GL_TRIANGLES, 0, 6); ``` 再将缓存中的数据写入显示窗口的缓存: ``` glBindFramebuffer(GL_READ_FRAMEBUFFER, FrameBuf); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glViewport(0, 0, 400, 400); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glReadBuffer(GL_COLOR_ATTACHMENT0); glBlitFramebuffer(0, 0, 200, 200, 0, 0, 200, 200, GL_COLOR_BUFFER_BIT, GL_NEAREST); glReadBuffer(GL_COLOR_ATTACHMENT1); glBlitFramebuffer(0, 0, 200, 200, 200, 0, 400, 200, GL_COLOR_BUFFER_BIT, GL_NEAREST); ``` 这是三角形的数据: ``` Vertex Verts[9] = { //第一个大三角形,三个顶点颜色分别为RGB,前四个float为颜色,后三个float为位置 { { 255,0,0,255 },{ 0.0f, 0.9f, 0.0f } }, { { 0,255,0,255 },{ -0.9f, -0.9f, 0.0f } }, { { 0,0,255,255 },{ 0.9f, -0.9f, 0.0f } } , //第二个小三角形,三个顶点颜色为白色 { { 255,255,255,255 },{ 0.0f, 0.8f, -0.2f } } , { { 255,255,255,255 },{ -0.4f, 0.0f, -0.2f } } , { { 255,255,255,255 },{ 0.4f, 0.0f, -0.2f } } }; ``` 以上就是画了两个小三角形,attachment0的在左下角,attachment1的在右下角。按理来说只调用了一次glDrawArrays(),两个三角形应该是一样的,但是真实的图片显示并不一样。这是为什么呢? ![图片说明](https://img-ask.csdn.net/upload/201911/28/1574911083_510881.png)
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值