openGL深度缓冲区问题
http://zhidao.baidu.com/question/368299839.html&__bd_tkn__=6aa9196c746cd3357f1eec74aeb127b3950291e48078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157b5af530946ea1fb570f03de0125270dd437ba784d759374792fc88ea54d4375005c3b5bc4610f424abcdaaaef7efdaccbdc8d02c93122f54dad
初始化函数
GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清除颜色
GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);
GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();
GL.gluPerspective(90.0f, 1.0 * this.Width / this.Height, 0, 200);
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
GL.gluLookAt(0.0, 0.0,12.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //眼睛位置 绘制函数 GL.glEnable(GL.GL_DEPTH_TEST);
GL.glDepthMask((Byte)GL.GL_TRUE); GL.glDepthFunc(GL.GL_LESS); double d1 = 8.6;
double d2 =0.5; GL.glClear(GL.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT); GL.glColor3d(1.0, 0.0, 0.0);
GL.glutSolidSphere(0.6, 40, 32); GL.glTranslatef(0.0f, 0.0f, 5.0f);
GL.glColor3d(0.0, 1.0, 0.0);
GL.glutSolidSphere(1.0, 40, 32); 我想用 绿球完全挡住红球,就是红球看不见。但是上面代码,绿球中间显示红球。不知为什么。
我实在C#下用的openGL。我感觉好像是深度缓冲区的值没有变,或者两次绘制时深度缓冲区的值一样,但是我已经使用了 GL.glDepthMask((Byte)GL.GL_TRUE); 我把 GL.glDepthFunc(GL.GL_LESS); 改成小于等于就可以覆盖掉红球
提问者采纳
第一:GL.glDepthFunc(GL.GL_LESS); //opengl中这是默认值,不必多此一举 第二:GL.gluPerspective(90.0f, 1.0 * this.Width / this.Height, 0, 200);
这意味着:
投影矩阵=
0.75 0 0 0
0 1 0 0
0 0 1 0
0 0 0 0 <--决定计算出来的w恒为0 也就是说,世界坐标(x,y,z)->扩展4元(x,y,z,1)->视图坐标(x',y',z',1)(glLookat决定视图矩阵
), 最后转化成齐次坐标或者clip坐标(x'',y'',z'',w=0)
判断重叠的点的深度。
显然 z1''/w ==z2''/w (大小当然是int类型的最大值),两个值相同,且红球绘制在先,所 以绿球没办法遮挡红球。因为绿球深度总是=红球深度,在GL_LEST的情况下。 当你改为GL_LEQUAL时,红球先绘制,绿球因为深度值等于红球的,就写入深度缓冲。红球对应的片断都会被剔除掉。自然就只有绿球了。 3)所以正确的做法:
gluPerspective()函数 中将near由0,改成1~6就可以了。
openGL深度缓冲区问题的更多相关文章
- [译]OpenGL像素缓冲区对象
目录概述创建PBO映射PBO例子:Streaming Texture Uploads with PBO例子:Asynchronous Readback with PBO 概述 OpenGL ARB_p ...
- OpenGL模板缓冲区与模板测试
原文地址:http://www.blogjava.net/qileilove/archive/2014/01/23/409269.html 帧缓冲区有许多缓冲区构成,这些缓冲区大致分为: 颜色缓冲区: ...
- OpenGL顶点缓冲区对象
[OpenGL顶点缓冲区对象] 显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码.在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件.在最好的情况下,是编 ...
- OpenGL顶点缓冲区对象(VBO)
转载 http://blog.csdn.net/dreamcs/article/details/7702701 创建VBO GL_ARB_vertex_buffer_object 扩展可 ...
- opengl模板缓冲区
相信大家有些人对opengl的模板缓冲区不是很理解,包括我最开始也是,opengl的模板缓冲区其实就是采用过滤的技术来控制那些颜色可以绘制,那些不能进行绘制.这里的过滤技术也就是我们的一个控制方法,主 ...
- OpenGL中的深度、深度缓存、深度测试及保存成图片
1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...
- OpenGL缓冲区
OpenGL缓冲区 颜色缓冲区 OpenGL时,先是在一个缓冲区中完毕渲染,然后再把渲染结果交换到屏幕上. 我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区.在默认情况下,OpenGL命令是在 ...
- OpenGL学习脚印:深度測试(depth testing)
写在前面 上一节我们使用AssImp载入了3d模型,效果已经令人激动了.可是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们载入 ...
- OpenGL超级宝典笔记——深度纹理和阴影 【转】
目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面). ...
随机推荐
- java8之list集合中取出某一属性的方法
上代码 List<User> list = new ArrayList<User>(); User user1 = new User("第一位"," ...
- 笔记-爬虫-模拟登录github
笔记-模拟登录github 1. 模拟登录github 1.1. 环境准备 安装/升级requests 2.20.0 pip install --upgrade requests pi ...
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- Android stadio butternife工具
http://www.androidchina.net/5068.html svn今天我对它有了更深的认识.我知道了有冲突了不能提交.但是可以update,updata之后就会有冲突的东西生成,如果你 ...
- NSThread那些事儿
NSThread 哎呀,它面向对象,再去看看苹果提供的API,对比一下Pthreads,简单明了,人生仿佛又充满了阳光和希望,我们先来一看一下系统提供给我们的API自然就知道怎么用了,来来来,我给你注 ...
- lintcode
public class Solution { /** * @param s: The first string * @param b: The second string * @return tru ...
- Nuget.config格式错误,请检查nuget.config配置文件
安装 VS 2015 Professional 版,安装后,我想加一个nuget的包配置. 然后提示我:Nuget.config格式错误,请检查nuget.config配置文件 我找到了 Nuget. ...
- Python 3基础教程10-全局变量和局部变量
本文来讲讲全局变量和局部变量,前面学习了函数的基本使用,所以,这里就要注意变量的使用和访问权限. 试试下面的demo.py
- shell监控脚本
序言: 前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控 ...
- 转载:Android SQLite数据库版本升级原理解析
Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...