行业知识
openGL缓存概念和缓存清除(01)
一、说明
���作缓存就是操作屏幕;而因为渲染的多样性需求,缓存是多样的,对多样的缓存操作,就是渲染操作。本篇对基本的几个渲染缓存进行操作。
()二、gl函数明细
2.1 示例代码
from OpenGL.GL import *from OpenGL.GLU import *from OpenGL.GLUT import *def drawFun(): glClearColor(1.0,0.0,1.,0.0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glutWireTeapot(0.5) glFlush()glutInit()glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)glutInitWindowSize(500, 500)glutCreateWindow("First")glutDisplayFunc(drawFun)glutMainLoop() 2.3 buff清除glClear
- 函数原型:
void glClear(GLbitfield mask);
- 参数说明:
GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位
GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲
()GL_DEPTH_BUFFER_BIT: 深度缓冲
GL_ACCUM_BUFFER_BIT: 累积缓冲
GL_STENCIL_BUFFER_BIT: 模板缓冲
- 函数说明:
glClear()函数的作用是用当前缓冲区清除值,也就是glClearColor或者glClearDepth、glClearIndex、glClearStencil、glClearAccum等函数所指定的值来清除指定的缓冲区,也可以使用glDrawBuffer一次清除多个颜色缓存。
三、缓冲和渲染的关系
3.1 颜色buff的情节
** 例:用黄色背景清除屏幕**
glClearColor(1.0,1.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);
- 第一条语句表示清除颜色设为黄色,第二条语句表示实际完成了把整个窗口清除为黄色的任务,glClear()的唯一参数表示需要被清除的缓冲区。
- 像素检验、裁剪检验、抖动和缓存的写屏蔽都会影响glClear的操作,其中,裁剪范围限制了清除的区域,而glClear命令还会忽略alpha函数、融合函数、逻辑操作、模板、纹理映射和z缓存;
3.2 深度缓冲详解(DepthBuffer)
1. 深度缓冲概念
深度缓冲区与帧缓冲区相对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确。
2. 何为深度
深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度值(Z值)越大,则离摄像机越远。
3. 为什么需要深度?
在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。
4. 深度缓冲原理
深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。然后,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值 // per-frame time logic // -------------------- float currentFrame = static_cast
- 函数说明:
- 参数说明: