Chester的小院

无印良品

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2011年4月13日

摘要: 转自http://www.cppblog.com/w2001/archive/2008/05/10/49376.htmlOpenGL VBO并不难,但是较繁琐,其实其概念跟加载纹理是一样的:初始化阶段:1.glGenBuffersARB(1, &nVBOVertices); //生成一个句柄2.glBindBufferARB(GL_ARRAY_BUFFER_ARB, nVBOVertices); //声明该句柄为一个vbo句柄,并选择之3.glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertices), vertices,GL_STATIC_ 阅读全文
posted @ 2011-04-13 02:05 chester_lp 阅读(457) 评论(0) 推荐(0)

摘要: 如图,红色的处理过程是1.7.1不同于1.6.3的。至于摄像机监听的listener处理的作用,有待于后续研究。。。 阅读全文
posted @ 2011-04-13 01:34 chester_lp 阅读(119) 评论(0) 推荐(0)

摘要: 上面是我绘制的一张图。 关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager。 下面摘录图片中的文字:松散八叉树的数据结构。属性:其中mBox为其包围盒,mHalfSize定义为包围盒大小的一半。mChildren是一个大小为8的静态数组,里面保存了8个Octree指针,由八叉树场景管理器创建,由本类管理。mNodes为挂接到当前八叉树上面的八叉树场景节点,mNumNodes保存了挂接到当前八叉树及其子树上面的节点数量总和。mParent为当前八叉树的父树。方法:_isTwiceSiz 阅读全文
posted @ 2011-04-13 01:32 chester_lp 阅读(1938) 评论(0) 推荐(0)

摘要: 渲染队列在Ogre中是一个重要的概念,在场景中的所有物体都会在绘制前被 Ogre放入到一个特定的渲染队列中。渲染队列主要起两个作用:1.确保正确的绘制顺序。比如先绘制天空盒再绘制一般物体,最后绘制界面。2.提高渲染效 率。Ogre将具有相同pass的物体放在一起进行绘制,目的是尽可能减少渲染状态的切换。一般用户常用的是在entity中设置渲染队列序号,其实整个渲染队 列的工作流程远远比这个复杂,但基本不需要最终用户干预。这篇文章就是要把这部分不用干预的细节分析一下。 渲染队列是构成Ogre渲染流程和控制渲染效率的关键一环,所以应该深入学 习和理解这个部分。我认为通过这个过程不仅可以学习到优秀. 阅读全文
posted @ 2011-04-13 01:24 chester_lp 阅读(276) 评论(0) 推荐(0)

摘要: 直接给图: 阅读全文
posted @ 2011-04-13 01:20 chester_lp 阅读(126) 评论(0) 推荐(0)

摘要: 首先分享一个我做的图,没有严格按照UML规范,主要是要表达这样的一个意思而已。[原图:http://ishare.iask.sina.com.cn/f/7863351.html] 首先需要明确一些这样的信息: 1.每个高级Shader语言都可以编译成汇编代码的形式。在cg中我们使用cgGetProgramString,DX有API可以用:D3DXAssembleShader。 2. 每个Shader的参数(这里指需要由应用程序输入的元素)都存在于GPU的寄存器中。我们可以得到它们的索引,但是这个索引并非寄存器的编号。cg中有方法cgGetParameterResourceIndex,DX中可以 阅读全文
posted @ 2011-04-13 01:18 chester_lp 阅读(404) 评论(0) 推荐(0)

摘要: 注意,最新版Ogre1.71已经完全支持VS2010,所以以下步骤对于1.71或者其后的版本来说都可以省略了,按照以前的编译方法编译即可。旧版本请继续往下看。 (2010.5.24 patch)提前说明:Ogre版本1.70,平台Windows,VS2010RC,DirectX SDK版本应该尽量用最新的,我的是2010年2月版本,希望大家也用这个以避免不必要的麻烦。注意,如果你是在Windows XP下面,必须采用最新的新点的DXSDK,否则遇到与VS2010RC的平台SDK冲突就不要怪我了,另外还要保证DXSDK的搜索优先级高于平台SDK。另外建议你下载最新的Boost,然后用VS201. 阅读全文
posted @ 2011-04-13 01:15 chester_lp 阅读(1218) 评论(1) 推荐(0)

摘要: Note that the changes are backwards compatible, so they will work con 1.6 tooSimpleGrid.cpp line 305 changeCode: mHydrax->getMesh()->getEntity()->getParentSceneNode()->getWorldTransforms(&mWorldMatrix);withCode: #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 7 mWo 阅读全文
posted @ 2011-04-13 01:04 chester_lp 阅读(405) 评论(0) 推荐(0)

摘要: 一、蒙板 蒙板是这样的一种机制,他用来控制深度在蒙板其后的物体,在蒙板区域的某个位置是否被显示。这个功能可以使用混色通过控制ALPHA通道的值来完成,但是这样的效果并不好,会产生蒙板上物体比较虚的效果。使用蒙板以后我们可以使得透过深度较靠前的物体看到深度较靠后物体的一个部分。 这个机制可以用两种方法来实现。 第一种方式是使用模拟的方式,它的原理是使用混色当中的象素叠加操作。所以我们在操作的一开始必须要打开混色开关,glEnable(GL_BLEND);然后我们在需要的地方放置我们的蒙板,模板是一个黑白贴图,在需要透视的后方物体的地方这个贴图使用白色,而需要遮挡的地方我们使用黑色。在载入并绑定蒙 阅读全文
posted @ 2011-04-13 01:02 chester_lp 阅读(1017) 评论(0) 推荐(0)

摘要: struct 中的member variable 的offset的宏定义#define offsetof(s,m) (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))定义:#define offsetof(type, f) ((size_t) ((char *)&((type *)0)->f - (char *)(type *)0))解释:【akirya】:先将0转化为 type*类型的指针,然后取得成员变量的地址,在减去0最后得到的就是 成员变量的偏移地址.【Jarryl 阅读全文
posted @ 2011-04-13 01:01 chester_lp 阅读(464) 评论(0) 推荐(0)

摘要: 位域有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct 位域结构名{ 位域列表 };其中位域列表的形式为: 类型说明符 位域名:位域长度例如:struct bs{ 阅读全文
posted @ 2011-04-13 00:59 chester_lp 阅读(148) 评论(0) 推荐(0)

摘要: 作者:王浩从http://blog.donews.com/yyh/archive/2005/05/19/387143.aspx转载。前言:真实的游戏效果 shadow volume 这个术语几乎是随着 DOOM3 的发布而成为FPS 玩家和图形学爱好者谈论的对象的。虽然这个游戏还没有上市,但是凭借 John Carmack 的传奇经历以及 DOOM3发布的一些让人惊讶的预览图片,我们仍然有理由认为它将会是 2004 年最热门的 FPS 游戏之一。 id software向来都不吝惜为了达到最好的图像效果而使用最先进的渲染技术,这曾经使得玩家为了玩它开发的游戏而不得不掏光口袋里面的钱来升级电脑, 阅读全文
posted @ 2011-04-13 00:58 chester_lp 阅读(551) 评论(0) 推荐(0)

摘要: TGA文件用作纹理较BMP文件的优势在于:TGA文件的载入不需要使用aux库,并且TGA纹理可以拥有ALPHA通道。而载入TGA文件作为纹理必须要了解的是TGA文件的文件结构。TGA文件的文件结构如下面的表所示偏移长度描述32位常用图像文件各个字节的值01指出图像信息字段的长度,其取值范围是 0 到 255 ,当它为 0 时表示没有图像的信息字段。011是否使用颜色表,0 表示没有颜色表,1 表示颜色表存在021该字段总为 2。图像类型码,tga一共有6种格式,2表示无颜色表 rgb 图像235颜色表规格,总为0。0405060708 10 图像规格说明 开始82图像 x 坐标起始位置,一般. 阅读全文
posted @ 2011-04-13 00:32 chester_lp 阅读(629) 评论(0) 推荐(0)

摘要: OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨 论这个了)下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产. 阅读全文
posted @ 2011-04-13 00:20 chester_lp 阅读(178) 评论(0) 推荐(0)

摘要: 合理设计之一:将共享的成员放置到base class中。合理设计之二:对于class的成员,应该在构造函数中或者其他的成员函数中初始化。如果让子类class去初始化base class的成员,将会破坏封装性。 纯虚析构函数设计者一定要定义它,因为子类调用析构函数的时候,会默认静态地调用积累的虚析构函数,因此中间层如果没有定义,则会出现连接失败。因此一个较好的方案是,不要把析构函数写成纯虚。 如果成员member function声明成虚函数,但是函数体是一个inline形式的(如果简单地return一个member data),那么每次被调用,而根本不会被子类复写的。这样的函数调用会消耗很大的 阅读全文
posted @ 2011-04-13 00:17 chester_lp 阅读(147) 评论(0) 推荐(0)

摘要: 4.1 Member的各种调用方式Nonstatic Member Functions:速度和一般的Nonmember function 有相同的效率。 编译器会对nonstatic member function进行改造。加入this参数,改变函数内部的对member data 的使用方法(使用this指针来存取!),改变函数的名字--相当于nonmember function。这里面有一个函数名字的处理问题(name mangled处理)。Virtual Member Funciton:首先虚函数的调用方式若是指针调用,则是通过指针,找到vptr,打出偏移找到函数地址进行调用。其次,vpt 阅读全文
posted @ 2011-04-13 00:16 chester_lp 阅读(249) 评论(0) 推荐(0)

摘要: C++ standard 不强制规定“base class subjects的排列次序”“不同存取层记得data members的排列次序” ,也不规定“virtual funcitons 和 virtual base class“的实现细节。当一个类并没有任何声明的时候,它实做一个对象的时候,实际分配了1个字节的大小的空间。从而使得这个对象能够有独一无二的地址空间。而一个对象的大小不仅仅包含了该类所声明的nonstatic data members,而且还受到了,1、支持语言特性(各种virtual特性)。2、边界对齐特性。的影响。形成其最终大小。3.1 Data Member的绑定(The 阅读全文
posted @ 2011-04-13 00:16 chester_lp 阅读(233) 评论(0) 推荐(0)

摘要: 2.1 Default Constructor 的构建操作 Default Constructors只有当编译器需要default constructor的时候才会合成出一个constructor, 只有下面的四种情况才会有nontrivial default constructor产生,其余的都是trivial default constructor。(nontrivial是合成的有用的默认函数,trivial则是没多大用处的构造器) a、带有Default Constructor 的 Member Class Object如果一个class自己没有定义constructor,但是内含一个m 阅读全文
posted @ 2011-04-13 00:14 chester_lp 阅读(332) 评论(0) 推荐(0)

摘要: 从准备找工作至今,才阅读完B.Lippman的Inside The C++ Object Model。所以索性整理一下对C++对象模型一书的读书心得。 --by chesterlee第一章 关于对象 首先应该说下C的“算法驱动”思路:C语言中,“数据”和“处理数据的操作”十分开来的。简言之,这样的程序方法叫做“程序性的”,由以功能为导向的函数的算法所驱动,处理的是来自外部的数据。 而在C++中,则使用的是独立的“抽象数据类型abstract data type(ADT)”所驱动。这样符合软件工程的设计。如果不使用virtual,C++本身的class布局及存取时间和struct没有区别。言外之 阅读全文
posted @ 2011-04-13 00:12 chester_lp 阅读(246) 评论(0) 推荐(0)