深度缓冲区原理
深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。
然后,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。
其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值<原先像素深度值,则新像素值会取代原先的;反之,新像素值被遮挡,他颜色值和深度将被丢弃。
为了启动深度缓冲区,必须先启动它,即glEnable(GL_DEPTH_TEST)。每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体。
- GLES20.glEnable(GLES20.GL_DEPTH_TEST);
- //清除深度缓冲与颜色缓冲
- GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
- MatrixState.pushMatrix();
- MatrixState.translate(0, -2, 0);
- textRect.drawSelf(textureFloor);
- GLES20.glDepthFunc(GLES20.GL_GREATER);
- GLES20.glDisable(GLES20.GL_DEPTH_TEST);
textRect.drawSelf(textureFloor);无法在屏幕上显示,因为glClear使当前屏幕缓存为远裁减面,GLES20.glDepthFunc(GLES20.GL_GREATER);这个代码虽然在绘制代码后面,但是仍然影响了drawSelf<虽然默认属性为GL_LESS>.
- GLES20.glEnable(GLES20.GL_DEPTH_TEST);
- //清除深度缓冲与颜色缓冲
- GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
- MatrixState.pushMatrix();
- MatrixState.translate(0, -2, 0);
- GLES20.glDepthFunc(GLES20.GL_LESS);
- textRect.drawSelf(textureFloor);
- bfd.drawSelfMirror( textureBallId);//绘制镜像体 仍然按照less的方式绘制。不会出现上面用GREATER的方式绘制
- GLES20.glDepthFunc(GLES20.GL_GREATER);
- GLES20.glDisable(GLES20.GL_DEPTH_TEST);
可以绘制出textRect。可以知道:如果某一个绘制需要深度缓存,则在其前面设置DepthFunc方式。不然后面的设置也会影响。
如果设置过一次:DepthFunc以后只有当再次设置才会改变起作用,。
刚接触OPENGL没多久,这个规则搞了我一天,感觉弱爆了。不过也觉得这应该是OPENGL的一个bug。