3D Computer Grapihcs Using OpenGL - 09 Enable Depth Test
启用Depth Test
OpenGL是个3D绘图API,也就是说不只有xy坐标轴,还有第三个坐标轴z,z轴的方向是垂直于屏幕,指向屏幕内。
靠近人眼的方向是负方向,标准化设备坐标的最小值是-1, 最大正值是1.
在未启用深度测试的情况下,同一个像素如果被绘制两次,后绘制的像素会覆盖先绘制的像素。
如果启用了深度测试,情况则完全不同了。后绘制的像素会对深度做一次比较,如果后绘制的像素深度(z)小于之前的像素深度,则会覆盖,如果大于或者等于之前的像素深度,则不会覆盖。
Depth需要在绘制之前启用。在intializeGL()函数中增加
glEnable(GL_DEPTH_TEST);
为了使深度测试起作用,我们还需要在绘制的每一帧前进行一个清理,在paintGL()函数第一行之前加入:
glClear(GL_DEPTH_BUFFER_BIT);
修改三角形进行测试
我们之前的两个三角形没有穿插的地方,现在我们可以稍作修改,重新绘制两个有穿插的三角形,并且给予他们的每个点一个z坐标,当然,相应的代码也要做些调整。
首先修改verts[]数组:
GLfloat verts[] =
{
-1.0f, -1.0f, +0.5f,//Vertex 0
+1.0f, +0.0f, +0.0f,//Color 0
+0.0f, +1.0f, -0.5f,//Vertex 1
+0.0f, +1.0f, +0.0f,//Color 1
+1.0f, -1.0f, +0.5f,//Vertex 2
+0.0f, +0.0f, +1.0f,//Color 2 -1.0f, +1.0f, +0.5f,//Vertex 3
+0.5f, +0.3f, +0.1f,//Color 3
+0.0f, -1.0f, -0.5f,//Vertex 4
+0.1f, +0.4f, +0.2f,//Color 4
+1.0f, +1.0f, +0.5f,//Vertex 5
+1.0f, +0.5f, +0.2f,//Color 5
};
索引数组也要更改:
GLushort indices[] =
{
,,,
,,,
};
sendDataToOpenGL()函数的最后几行也要相应修改:
glEnableVertexAttribArray();
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, sizeof(GLfloat) * , ); glEnableVertexAttribArray();
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, sizeof(GLfloat) * , (char*)(sizeof(GLfloat) * ));
VertexShaderCode.glsl也要相应修改:
#version in layout(location=) vec3 position;
in layout(location=) vec3 vertexColor; out vec3 passingColor; void main()
{
gl_Position= vec4(position,1.0);
passingColor= vertexColor;
}
注:第3行vec2变成了vec3,因为现在每个位置数据是三个float,另外第10行因为position现在是vec3,所以去掉了一个0.0.
编译运行会发现两个三角形相互穿插。

3D Computer Grapihcs Using OpenGL - 09 Enable Depth Test的更多相关文章
- 3D Computer Grapihcs Using OpenGL - 10 Color Buffer
		
本节我们将尝试利用三角形制作一个“走马灯”效果. 一个三角形如图示方式,从左向右依次移动. 先看一下代码: MyGlWindow.cpp #include <gl\glew.h> #inc ...
 - 3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(顶点数组对象)
		
大部分OpenGL教程都会在一开始就讲解VAO,但是该教程的作者认为这是很不合理的,因为要理解它的作用需要建立在我们此前学过的知识基础上.因此直到教程已经进行了一大半,作者才引入VAO这个概念.在我看 ...
 - 3D Computer Grapihcs Using OpenGL - 16 使用DrawElementsInstanced绘制立方体
		
我们使用15节学到的知识来绘制14节的立方体. 在第14节我们使用了两次glDrawElements实现了OpenGL实例化,发现这样仍然不太方便,如果需要绘制成千上万的立方体,就需要手写成千上万次的 ...
 - 3D Computer Grapihcs Using OpenGL - 15 Draw Element Instanced
		
友情提示:继续本节之前,需要保存此前的代码,本节为了试验,会对代码做一些修改,但后续的修改需要我们把代码返回之前的进度. OpenGL内置支持Instancing,有专门的函数来处理这件事情. 为了方 ...
 - 3D Computer Grapihcs Using OpenGL - 14 OpenGL Instancing
		
如果我们需要绘制两个(或者多个)一样的立方体(或者物体),只是位置.缩放.旋转不一样,那么我们可以不需要多次将这个物体的顶点信息.颜色信息等发送到显卡,而是发送一次,绘制多次,仅仅是每次绘制之前应用不 ...
 - 3D Computer Grapihcs Using OpenGL - 11 Model View Projection Matrices
		
本节我们将绘制一个3维物体,立方体. 如果要渲染3D物体,我们需要了解MVP(Model View Projection),它表示三个转换矩阵.实际上这个名字不够明确,更加确切的释义如下: Model ...
 - 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders
		
从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...
 - 3D Computer Grapihcs Using OpenGL - 05 EBO
		
本节将采用两种方法绘制两个三角形. 先看第一种方法的代码 MyGlWindow.cpp #include <gl\glew.h> #include "MyGlWindow.h&q ...
 - 3D Computer Grapihcs Using OpenGL - 04 First Triangle
		
本节将绘制一个三角形 先看最终代码: MyGlWindow.cpp: #include <gl\glew.h> #include "MyGlWindow.h" void ...
 
随机推荐
- 为什么存储过程比sql语句效率高?
			
存储过程经过预编译处理 而SQL查询没有 SQL语句需要先被数据库引擎处理成低级的指令 然后才执行 -------------------------------------------------- ...
 - CM使用MySQL数据库预处理scm_prepare_database.sh执行报错:java.sql.SQLException: Access denied for user 'scm'@'hadoop101.com' (using password: YES)
			
1.报错提示: [root@hadoop101 ~]# /opt/module/cm/cm-/share/cmf/schema/scm_prepare_database.sh mysql cm -hh ...
 - HTTP/2 最新漏洞,直指 Kubernetes!
			
Java技术栈 www.javastack.cn 优秀的Java技术公众号 在这个数据.应用横行的时代,漏洞的出现早已屡见不鲜.在尚未造成大面积危害之前,我们该如何做好防御措施?或许从过往经常发生漏洞 ...
 - 洛谷 P1484 种树(优先队列,贪心,链表)
			
传送门 解题思路 第一眼的贪心策略:每次都选最大的. 但是——不正确! 因为选了第i个树,第i-1和i-1棵树就不能选了.所以,要有一个反悔操作. 选了第i个后,我们就把a[i]的值更新为a[l[i] ...
 - Scrapy 教程(三)-网站解析
			
有经验的人都知道,解析网站需要尝试,看看得到的数据是不是想要的,那么在scrapy中怎么尝试呢? 调试工具-shell 主要用于编写解析器 命令行进入shell scrapy shell url 这个 ...
 - 《CSS权威指南》双鱼书详解——第二章选择器
			
一.基本规则 CSS的核心特性就是能向文档中的一组元素类型应用某些规则. 二.规则结构 选择器+声明块. h1{ color:red;background:yellow;} ,声明块由一个或多个声明组 ...
 - HTML-美化
			
1.美化文本 1.1第一部分 font-size:字体大小,常用em.px.%.rem作单位,预设值small.large.medium,可继承, font-weight:加粗字体,属性为bold,加 ...
 - 3.css3文字与字体
			
1.css3文字与字体: ①Font-size:大小. ⑴通常使用px.百分比.em来设置大小: ⑵xx-small.x-small.small.medium.large.x-large.xx-lar ...
 - R语言 绘图——条形图可以将堆积条形图与百分比堆积条形图配合使用
			
在使用堆积条形图时候,新增一个百分比堆积条形图,可以加深读者印象. 封装一个function函数后只需要在调用的数据上改一下pos=‘fill’的代码即可.比较方便. 案例: # 封装函数 fun1& ...
 - linux MySQL 初始化数据库
			
#创建数据目录并且初始化 /bin/mysql_install_db –user=mysql