记录一个深度测试的问题

在实现一个简单的OpenGL程序时,遇到了一个问题,深度测试总是有问题,无法正常显示,如下

  

正常情况为

  

通过调试发现屏幕空间中的所有深度值均为1。

OpenGL代码如下:

void initOpenGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f); glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.0, 100);
mvp.setProjection(projectionMatrix);
mvp.setViewTranslate(0.0f, 0.0f, -3.0f);
} void renderScence()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ... ... glutSwapBuffers();
}
 

  代码并无明显问题,通过查找相关资料,最后发现是投影矩阵的问题,问题的根源是perspective的第三个参数是透视投影的近平面,近平面的值要始终是正数

  将  vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.0, 100);

  改为 vmath::mat4 projectionMatrix = vmath::perspective(60, float(width) / float(heigh), 0.1, 100);

程序运行正确。

深度图如下:

相关内容可以查看透视投影的推导过程,

如下所示,透视投影假设人眼位置为0,近平面位置大于0,

  

  图出自OpenGL编程指南8

 
 
 
 
 

【OpenGL】GL_DEPTH_TEST深度测试问题的更多相关文章

  1. OpenGL管线(用经典管线代说着色器内部)

    图形管线(graphics pipeline)向来以复杂为特点,这归结为图形任务的复杂性和挑战性.OpenGL作为图形硬件标准,是最通用的图形管线版本.本文用自顶向下的思路来简单总结OpenGL图形管 ...

  2. OpenGL显示图片

    最近想用C++在windows下实现一个基本的图像查看器功能,目前只想到了使用GDI或OpenGL两种方式.由于实在不想用GDI的API了,就用OpenGL的方式实现了一下基本的显示功能. 用GDAL ...

  3. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. Qt5.6.0+OpenGL 纹理贴图首战告捷

    重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...

  5. Android OpenGL 开发

    2013-06-30 Android OpenGL 开发 Android提供OpenGL包,专门用于3D的加速和渲染等. OpenGL, Open Graphics Library, 是一个专业的图形 ...

  6. 【转】OpenGL概述

    英文原文 中文译文 1. 计算机图像硬件 1.1 GPU(图像处理单元) 如今,计算机拥有用来专门做图像处理显示的GPU模块,拥有独立的图像处理储存(显存). 1.2 像素和画面 任何图像显示都是基于 ...

  7. OpenGL学习笔记(六)坐标系统

    目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...

  8. 基于glew,freeglut的imshow

    OpenGL显示图片,这篇博客使用glew + freeglut + gdal来实现imshow. 主要修改: 使用BGR而不是RGB,保持和opencv行为一致 纯C,去掉C++相关的 去掉GDAL ...

  9. SharpGL学习笔记(十六) 多重纹理映射

    多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...

随机推荐

  1. js删除数组的某个元素

    最近在刷算法题,我是用js语言去写的,其中一题需要删除数组的某个元素,查了一下资料,总结一下 使用splice()方法 array.splice(start[, deleteCount[, item1 ...

  2. DSN

    用户DSN注册信息记录在本机的注册表上 文件DSN保存在本地磁盘上 系统DSN注册在服务器的注册表上,所以客户端连接服务器,只要一台在服务器建立了DSN,其他客户端登录时都会看到该DSN

  3. python中end=''

    end = ''  用于连接下一条的print输出内容 效果图: 代码: # end='' 用于连接下一条输出语句 print('哈哈哈') print('嘻嘻嘻') print('\n\n') pr ...

  4. APICloud开发者进阶之路 |audioRecorder录音模块Demo

    本文出自APICloud官方论坛   audioRecorder 模块通过封装系统的录音接口,能够快速的为开发者提供一个完整的录音功能. 该模块提供Android和iOS版本,录音方式及录制的音频格式 ...

  5. 通过核心API启动单个或多个scrapy爬虫

    1. 可以使用API从脚本运行Scrapy,而不是运行Scrapy的典型方法scrapy crawl:Scrapy是基于Twisted异步网络库构建的,因此需要在Twisted容器内运行它,可以通过两 ...

  6. hdu6638 线段树求最大子段和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 Problem Description There are n pirate chests bu ...

  7. Selenium的简单使用

    selenium的使用对于新手来说十分友好,因为他避开了如今网络中的异步加载抓取的困扰,使得我们大部分的时间可以用于提取信息和存储中,下面就简单的列一些使用的代码,希望给同样初学的你有一定的参考价值. ...

  8. Linux.cp命令总提示是否覆盖

    执行cp命令,其实是默认执行了cp -i命令的别名,因此总提示是否覆盖. 修改~/.bashrc,注释“alias cp='cp -i'”即可. [root@xxxx test]# vi ~/.bas ...

  9. 关于C#程序的单元测试

    目录 1.单元测试概念 2.单元测试的原则 3.单元测试简单示例 4.单元测试框架特性标签 5.单元测试中的断言Assert 6.单元测试中验证预期的异常 7.单元测试中针对状态的间接测试 8.单元测 ...

  10. moco响应中文乱码

    moco版本为:moco-runner-standalone-0.11.1.jar 在一次使用moco框架的时候,浏览器查看响应时,发现返回来的中文是乱码. 按照网上的操作,在响应结果中加上heade ...