Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux

OpenGL超级宝典学习笔记——纹理高级(三)

OpenGL超级宝典学习笔记——纹理高级(三)

纹理组合器OpenGL的纹理组合器可以控制多重纹理的片段是如何组合的。一般情况下,我们可以简单的为每个纹理单元设置一个纹理环境模式(GL_REPLACE,GL_DECAL,GL_ADD和GL_MODULATE),把每个纹理应用的结果添加到下一个纹理单元中。然而纹理组合器提供了一个新的纹理环境GL_COMBINE允许我们显示地控制每一个纹理单元的纹理片段是如何组合的。使用纹理组合器模式代码如下:glTexEnvi(GL_TEXTURE_ENV, GL_TEX...
OpenGL超级宝典学习笔记——曲线和曲面(一)

OpenGL超级宝典学习笔记——曲线和曲面(一)

内部支持的表面GLU库中提供了一些二次曲面的支持。这些二次方程可以渲染球体,圆柱体,圆盘。这些函数有很大的灵活性,我们可以指定圆柱体的一端的半径,然后让另一端的半径为0,这样的话就能构建一个圆锥。我们还可以绘制一个有洞的圆盘。如下图:这些二次方程对象可以构建出更复杂的模型,例如我们可以用球体,圆柱体,圆锥,圆盘来构建一个3D坐标系的模型。在glTools中有提供了这个函数:void gltdDrawUnitAxes();设置二次方程状态在绘制二次方程对象之...
OpenGL超级宝典学习笔记——贝塞尔曲线和曲面

OpenGL超级宝典学习笔记——贝塞尔曲线和曲面

参数方程表现形式在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即与y轴的交点坐标)。类似地,我们也可以用一个参数方程来表示一条曲线。1962年,法国工程师贝塞尔发明了贝塞尔曲线方程。关于贝塞尔曲线的详细介绍可以参考(维基贝塞尔)。这里只介绍OpenGL实现贝塞尔的函数。OpenGl定义一条曲线时,也把它定义为一个曲线方程。我们把这条曲线的参数成为u,它的值域就是曲线的定义域。曲面则需要u和v两个参数来描述。注意...
OpenGL超级宝典学习笔记——NURBS与曲面细分

OpenGL超级宝典学习笔记——NURBS与曲面细分

NURBS贝塞尔曲线的缺点是当我们增加很多控制点的时候,曲线变得不可控,其连续性会变差差。如果控制点很多(高阶曲线),当我们调整一个控制点的位置,对整个曲线的影响是很大的。要获得更高级的控制,可以使用GLU库提供的NURBS(非均匀有理B样条)。通过这些函数我们可以在求值器中调整控制点的影响力,在有大量控制点的情况下,依然可以产生平滑的曲线。从贝塞尔到B样条贝塞尔曲线由起点、终点和其他控制点来影响曲线的形状。在二次贝塞尔曲线和三次贝塞尔曲线中,可以通过调整...
OpenGL超级宝典学习笔记——显示列表

OpenGL超级宝典学习笔记——显示列表

前言在先前的章节中,我们已经讨论OpenGL基本的一些渲染技术。这些基本的技巧足够渲染简单的图像,然而在渲染精细的画面逼真的画面的时候(非常多的顶点和纹理),如果使用之前的方式渲染(立即模式)速度就很慢了,考虑到性能的原因(特别是实时渲染)我们需要以更快的方式完成画面的渲染。精细的画面有大量的数据需要CPU和GPU去处理,而且把数据从应用程序发送到显卡有带宽和显存的瓶颈。显示列表到目前为止,我们的图元都是在一对glBegin/glEnd之间调用glVert...
OpenGL超级宝典学习笔记——顶点数组

OpenGL超级宝典学习笔记——顶点数组

顶点数组当我们有来自模型的大量数据的时候,使用显示列表来对这些数据进行预编译,需要遍历这些顶点数据(一次一个顶点数据)把数据传给OpenGL。依赖于顶点的数量,这会带来潜在的性能损耗。而且这些数据不一定是静态的,有可能在我们每次渲染的时候,我们需要对这些数据进行更改。这个时候就不适合使用显示列表。在OpenGl中,使用顶点数组能够很好的解决这两个问题。使用顶点数组,我们可以随时进行预编译或修改几何图形,然后一次性传输这些数据。基本的顶点数组几乎和显示列表一...
OpenGL超级宝典学习笔记——生成轮廓

OpenGL超级宝典学习笔记——生成轮廓

有时我们不需要物体的许多细节,而只需要其外围的轮廓来描绘物体大概的形状比如物体的阴影。如果我们简单的使用线框模式绘制一个立方体如下:下面介绍OpenGL生成轮廓的两种方式。多边形偏移多边形偏移是一个挺有用的技巧,有时会用来解决z-fighting。z-fighting在开启深度测试时,如果两个重叠物体的深度值非常接近,那么就有可能会产生z-fighting(因为在绘制物体时采用插值的方式,而插值会有一定的误差)。如下图遇到这种情况,我们就可以使用多变形偏移...
OpenGL超级宝典学习笔记——性能比较

OpenGL超级宝典学习笔记——性能比较

本文通过包含许多顶点数据的复杂模型来比较使用glBegin()/glEnd立即模式,显示列表,以及顶点索引数组的性能与内存。F-16 Thunderbird的飞机模型有3704个独立的三角形,通过Deep Exporation工具的索引模式编制后,共有1898个独立的顶点,2716个法线,2925个纹理坐标。下面代码展示DrawBody函数,通过遍历索引来为每一个独立的三角形设置并发送纹理,法线和顶点坐标。void DrawBody(void){int i...
OpenGL超级宝典学习笔记——顶点缓冲区对象

OpenGL超级宝典学习笔记——顶点缓冲区对象

显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码。在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件。在最好的情况下,是编译后放在图形硬件中以减少传输的带宽。显示列表的优化根据实现的不同而有所不同,而且显示列表一旦被创建就不可以修改,灵活性差。顶点数组提供了我们想要的灵活性,最坏的结果不过是把数据块复制给硬件而已(比立即模式快的多)。而索引顶点数组可以减少向硬件传输的顶点数据的数量,减少变换的开销。OpenGL...
OpenGL超级宝典学习笔记——选择

OpenGL超级宝典学习笔记——选择

有时我们不仅仅是渲染场景,而且还要与渲染的场景进行交互。大多数情况下是使用鼠标进行交互。注:viewing volume(可视区域,视景体)选择OpenGL的选择模式允许你通过鼠标点击屏幕,来选择鼠标下面的物体。使用OpenGL的选择特性,当你点击屏幕时就指定了一个可视区域,决定了哪些物体在这个可视区域中。基于你的屏幕坐标和你指定的像素大小,glu库提供了一个有用的函数gluPickMatrix来产生一个矩阵,使用这个矩阵可以在你当前鼠标的位置产生更小的可...
OpenGL超级宝典学习笔记——反馈

OpenGL超级宝典学习笔记——反馈

反馈像选择一样也是一种渲染模式,不会往帧缓冲区中写数据,而是把信息填充到反馈缓冲区中。与选择模式返回名称栈不同,反馈的这些信息包括窗口坐标中经过变换的顶点数据,经过光照计算后的颜色数据,以及纹理数据和其他在光栅化图元中需要使用的数据。通过调用glRenderMode(GL_FEEDBACK)进入反馈模式,调用glRenderMode(GL_RENDER)填充反馈缓冲区,并返回正常渲染模式。反馈缓冲区反馈缓冲区是浮点数数组,通过glFeedbackBuffe...
OpenGL超级宝典学习笔记——遮挡查询

OpenGL超级宝典学习笔记——遮挡查询

在一个场景中,如果有有些物体被其他物体遮住了不可见。那么我们就不需要绘制它。在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率。遮挡查询就是允许我们判断一组图形在进行了深度测试之后是否可见。遮挡查询之前为了显示遮挡查询对性能的提升,我们需要一个对照组(不使用遮挡查询来渲染场景)。首先我们先绘制“主遮挡物”。这个主遮挡物不需要太多的细节,一般是墙,天花板,地板之类的物体。在下面的例子中我们,使用6面墙来组成这个主遮挡物...
OpenGL超级宝典学习笔记——深度纹理和阴影

OpenGL超级宝典学习笔记——深度纹理和阴影

之前我们介绍过简单的把物体压平到投影平面来制造阴影。但这种阴影方式有其局限性(如投影平面须是平面)。在OpenGL1.4引入了一种新的方法阴影贴图来产生阴影。阴影贴图背后的原理是简单的。我们先把光源的位置当作照相机的位置,我们从这个位置观察物体,我们就知道哪些物体的表面是被照射到(被光源看到)的,哪些是没有被照射到(被遮挡住)的(在某个方向上离光源最近的表面是被照射的,后面的表面则没有被照射到)。我们开启深度测试,这样我们就可以得到一个有用的深度缓冲区数据...
OpenGL超级宝典学习笔记——新的模式

OpenGL超级宝典学习笔记——新的模式

在传统上,图形硬件设计的目标是快速地执行相同的硬编译的计算指令集。计算的步骤可以被跳过,参数可以被调整,但计算本身却是固定的。所以旧式的GPU设计被称为是“固定功能”的。现在的趋势是朝着通用图形处理器的方向发展。就像CPU一样,GPU也可以用任意的指令序列来执行图形计算。GPU和CPU最大的区别是,GPU的浮点数计算能力更强。在OpenGL2.0之前是固定函数渲染管线,在OpenGL2.0之后就是可编程函数渲染管线了。走出旧的模式在...
OpenGL超级宝典学习笔记——GLSL语言基础

OpenGL超级宝典学习笔记——GLSL语言基础

变量GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。基本类型除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下表:类型描述void跟C语言的void类似,表示空类型。作为函数的返回类...
OpenGL超级宝典学习笔记——顶点着色器示例

OpenGL超级宝典学习笔记——顶点着色器示例

以下内容只针对GLSL1.20的版本进行说明的,有些内置的变量在1.20之后,已经被废弃了。初次实验每个顶点着色器都至少输出一个裁剪空间的位置坐标。光照、纹理坐标的生成和其他的一些操作是可选的。例如,你要创建了深度纹理,那你只需要最终的深度值,你就没必要在着色器中处理颜色和纹理坐标,也不需要输出它们。但至少需要输出裁剪空间的坐标给后面的图元组装和光栅化。如果不输出任何东西,行为将是未定义的。如果要让颜色在后面的管道中可见,则至少要把输入的颜色拷贝到输出颜色...
OpenGL超级宝典学习笔记——片段着色器(二)

OpenGL超级宝典学习笔记——片段着色器(二)

图像处理图像处理是一种独立于顶点着色器的特殊处理程序。在不使用片段着色器的情况下绘制场景之后,可以按照各种方式应用卷积核。为了保持着色器的简洁,使用硬件加速,我们限制总卷积的大小为3X3.在示例程序中,调用glCopyTexIamge2D把帧缓冲区拷贝到纹理中。纹理的大下为小于窗口的2的最大N次方值(在2.0中则没有这个限制)。然后在窗口的中间绘制一个片段着色的四边形,大小与这个纹理相同,其纹理坐标从左下角(0,0)到右上角(1,1)。片段着色器基于纹理坐...
简述Java内存模型的由来、概念及语义

简述Java内存模型的由来、概念及语义

JDK5引入了JMM新规范:JSR-133,引入了happens-before/可见性等概念,对synchronized/volatile/final等关键词进行了语义定义。解决了:final变量在构造器中初始化的线程安全问题以及volatile变量与no-volatile变量之间的重排序问题。为什么需要Memory Model在多线程的场景下,thread1修改了一个变量后,thread2要读取这个变量,其间可能会发生指令执行顺序的问题(因为编译器优化指...
<< 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 >>