03 2011 档案
摘要:#include<stdio.h>voidmain(){inta[5]={10,20,30,40,50};int*p,*q;p=&a[0];q=&a[2];printf("%d,%d,%d,%d,q-p=%d\n",*p,*q,p,q,q-p);}得出结果是10,30,1245036,1245044,q-p=2q-p又得2?指针相减就是得出两个指针之间差距的元素个数INT型占四个字节,所以a[0]和a[2]之间相差的地址为8
阅读全文
摘要:在使用NVIDIA PerfHUD 5 Launcher的时候,明显发现现在的CPU时间和GPU时间不均衡,于是考虑优化。下面是参考NVIDIA的OGP开始总结。优化代码通常是找出瓶颈,对瓶颈进行优化,这里暂不考虑CPU内部的优化方法,主要记录CPU->GPU的3D渲染流水线的瓶颈查出方法以及优化手段。若仅希望进行CPU方面的优化,可使用一些辅助工具,如Inter的Intel(R) VTune(TM) Performance Analyzer,Intel(R) Thread Profiler 3.1,AMD的CodeAnalyst等。进行优化的步骤如上面所说:1:找出瓶颈,2:对其优化。
阅读全文
摘要:Skybox搞好后,发现在边线有很明显的裂缝,一开始时不知道如何解决,后来问了人,有人说把纹理采样改成Point,有人说纹理坐标改成0.001到0.999,这两样我都试过,发现改成Point裂缝是消除了,但看起来很不好看,改成0.001到0.999也有裂缝。 后来再问了一位高手,他就说了句,把Texture Addressing改了就行了。然后叫我直接查看DX SDK,我看了几种texture的address模式,终于领悟了,要采用纹理寻址的Clamp Texture Address Mode,可查看SDK。再把纹理坐标改成是0.001到0.999。问题就完美解决了。 渲染代码如下:p3DD.
阅读全文
摘要:温故知新,水面很早就实现了,但没有在这里写过,今天总结一下。 水的模拟要达到以下效果:水面的折射与反射,水的波动。要达到这种效果,需要以下四张纹理:折射纹理(RenderTarget),反射纹理(RenderTarget),Bumpmap,水自己的纹理。 折射与反射的原理就不具体说了,下面只说实现步骤。 一、渲染到纹理 RenderTarget的创建我不多述了,网上查查,我创建的是256X256的纹理,格式为X8R8G8B8。折射纹理比较简单,直接把当前的地形或在水面以下的物体渲染多次,注意,为提高性能,在这次pass中,可以选择带clip的shader(假如用到shader)或者直接使用水.
阅读全文
摘要:RTT是现在很多特效里面都会用到的一项很基本的技术,实现起来很简单,也很重要。但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿,不知道是因为太简单还是因为这项技术已经出现很长时间了。总之我是在摸索这个东西的时候绕了不少弯子。现在把具体的实现方法写下来。渲染到纹理,顾名思义就是把渲染目标从帧缓存变成一个纹理。这样就可以把一个场景渲染后在进行Post Process,做出现在流行的各种特效。另外在利用GPU做通用计算的时候程序也是通过RTT和GPU交换数据的。实现步骤:声明变量LPDIRECT3DTEXTURE9 pRenderTexture = NULL; // 目标纹理LPDIRECT
阅读全文
摘要:你要寻找什么,而且你有一个容器或者你有一个由迭代器划分出来的区间——你要找的东西就在里面。你要怎么完成搜索呢?你箭袋中的箭有这些:count、count_if、find、find_if、binary_search、lower_bound、upper_bound和equal_range。面对着它们,你要怎么做出选择?简单。你寻找的是能又快又简单的东西。越快越简单的越好。暂时,我假设你有一对指定了搜索区间的迭代器。然后,我会考虑到你有的是一个容器而不是一个区间的情况。要选择搜索策略,必须依赖于你的迭代器是否定义了一个有序区间。如果是,你就可以通过binary_search、lower_bound、
阅读全文
摘要:有些容器拥有和STL算法同名的成员函数。关联容器提供了count、find、lower_bound、upper_bound和equal_range,而list提供了remove、remove_if、unique、sort、merge和reverse。大多数情况下,你应该用成员函数代替算法。这样做有两个理由。首先,成员函数更快。其次,比起算法来,它们与容器结合得更好(尤其是关联容器)。那是因为同名的算法和成员函数通常并不是是一样的。我们以对关联容器的实验开始。假如有一个set<int>,它容纳了一百万个元素,而你想找到元素727的第一个出现位置(如果存在的话)。这儿有两个最自然的方法
阅读全文
摘要:假定你有一个标准STL容器,c,容纳int,Container<int> c;而你想把c中所有值为1963的对象都去掉。令人吃惊的是,完成这项任务的方法因不同的容器类型而不同:没有一种方法是通用的。如果你有一个连续内存容器(vector、deque或string——参见条款1),最好的方法是erase-remove惯用法(参见条款32):c.erase(remove(c.begin(), c.end(), 1963), // 当c是vector、stringc.end()); // 或deque时,// erase-remove惯用法// 是去除特定值的元素// 的最佳方法这方法也
阅读全文
摘要:Jake Simpson 译者: 向海 第1部分: 游戏引擎介绍, 渲染和构造3D世界 介绍 自Doom游戏时代以来我们已经走了很远。 DOOM不只是一款伟大的游戏,它同时也开创了一种新的游戏编程模式: 游戏 "引擎"。 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西。大量的新游戏根据已经存在的游戏引擎开发出来,而大多数都以ID公司的Quake引擎为基础, 这些游戏包括Counter Strike, Team Fortress, Tac Ops, Strike Force,
阅读全文
摘要:自由骑士笃志原创- -欢迎转载,呃,个人不对日志内任何资料真实性准确性负责BigWorld:澳大利亚优点: 1:动态负载均衡,服务器承受能力好。 2:服务器有较高的容错性,对服务器状况有专业的记录和管理报表分析。 3:功能全面,使用非常方便,开发速度快。 4:支持无缝世界。 5:嵌入的Python脚本,开发非常方面。缺点: 1:该引擎更适合制作FPS游戏。 2:结构完整度高,模块间契合度大,优化难度大。 3:仅支持RedHat服务器系统。其他描述:授权费用: 一个许可针对一个项目一个游戏。若一次性购买,价格为200W美元。相关技术说明: BW和其他网游引擎不同,它不是针对地图为单元,将地图为单
阅读全文
摘要:Author: FreeKnight前言:依旧,吐槽,哈哈哈~~~~其实依旧是为公司程序员扫盲,呼,挺想睡觉的其实。言归正传吧。1:神马是Dll和Lib,神马是静态链接和动态链接大家都懂的,DLL就是动态链接库,LIB是静态链接库。DLL其实就是EXE,只不过没main。动态链接是相对于静态链接而言的。所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源。而动态链接则是提供了一个函数的描述信息给可执行文件(并没有内存拷贝),当程序被夹在到内存里开始运行的时候,系统会在底层创建DLL和应用程序之间的
阅读全文
摘要:Author: FreeKnightHash表本身是很容易理解的,它本身是一个固定大小的数组,数组的每个元素是一个链表的头指针。我们对需要插入的元素,根据Hash算法算出一个对应的key,然后填充到对应的链表内做为尾节点。遍历的时候,我们先对需查找的元素计算其Key,直接通过数组找到其所在链表,此时仅对其所在链表进行遍历即可。但是,我们可以发现Hash表有以下问题。1:若Hash算法得到的值范围很大,那么,表数组会比较大,是无谓的内存浪费。2:若Hash算法得到的值范围很小,Key重复就会很高,遍历时查找的链表节点就太多,无法体现效率。所以合适的Hash算法是Hash表性能的关键。根据各种数学
阅读全文
摘要:Author: FreeKnightDuzhi关于Bloom和HDR的帖子和图片网上已是一堆,但罕有能够明确说明程序实现过程的帖子,明天需要进行简单一个讲解,故在此做个补充记录。首先HDR是高动态光照。注意两个词:1:高(高精度)。 2:动态(光照时实时运算的)。然后说下当前计算机图形学大部分颜色表示A8R8G8B8,即颜色可以表示为0-255的亮度(即一个深灰暗色到一个灰白亮色之间,并不能表示一个深黑色和一个非常耀眼的亮白色),用浮点数表示为【0,1】内,其实这是远不能表示人眼可分辨的亮度层级的(补,人眼可分辨亮度层级是1000,当前色彩学能表达的亮度层级是10的12次方……悲催啊,可怜的人
阅读全文
摘要:2008-09-01仔细背诵日语的三小时中,时间过的很慢,效率异常之高,学了不少东西,很高兴,拿Irrlicht放松放松。好久没看它了:)Irrlicht最核心的部分就是Device以及其下几个管理器。我们首先看一个简单的代码立刻可以理解这一切。#include <irrlicht.h> // 这是一个预编译头,包含了Irr的所有文件头Int main(){ IrrlichtDevice *g_pDevice = createDevice( … ); Scene::IsceneManager* g_pSceneMgr = g_ pDevice->getSceneManager
阅读全文
摘要:Irrlicht游戏引擎主要是由一个名叫Nikolaus Gebhardt奥地利人所设计,是sourceforge上的一个开源项目,也是著名的开源游戏引擎。Irrlicht是一个德国神话故事中的一种动物的名字,它能够发光和飞翔,可以在大部分的沼泽地附近发现它。单词"Irrlicht"是两个德国单词("irr"意思是疯狂的;而"Licht"意思是光)的组合。在英语中,它被译为"鬼火"。该项目从2004开始一直至今。在这个网站上你能够找到它的源代码、文档以及更多的信息:http://irrlicht.sourcefor
阅读全文
摘要:CEGUI 0.7x版本相比于以前的版本有了很大的改变. 基于它的Formatting Tags和Animation System特性对CEGUI做扩展, 比较方便实现一些常用的字体效果.1.Formatting Tags 本身就支持设定字体颜色, 字体大小,嵌套静态图片等. 详情可浏览 http://www.cegui.org.uk/wiki/index.php/Formatting_Tags_in_CEGUI所以字体下划线, 描边, 阴影等组合效果也可以通过定义自己的标签来指定哪一部分文字出现对应的字体效果.新增两种文字特效Tag:1.) [text-component='...&
阅读全文
摘要:在场景中被灯光照射的地方会产生阴影,这将使场景变的更真实。在这一部分我们将演示怎样实现平面阴影,即在平面上的阴影(如图8.5)。使用这种阴影只是一种权宜之计,虽然它增强了场景的真实效果,但是这并不是现实中的阴影。为了实现平面阴影,我们首先必须找到物体投射到平面上的阴影并进行几何建模以便我们能够渲染它,用一些3D数学就能很容易的实现它,然后我们用50%透明度的黑色材质来渲染描述阴影的多边形。渲染阴影时可能出现“双倍混合”,我们将用一小部分进行解释,并使用模板缓存来防止双倍混合发生。8.3.1平行光阴影图8.6显示了物体在平行光照射下得到的阴影。光线是从平行光源放射出的,它的方向是L,通过顶点p得
阅读全文
摘要:--------------------------------------------------------------------------------创建一个平面的阴影矩阵。定义:D3DXMATRIX *WINAPI D3DXMatrixShadow( D3DXMATRIX *pOut, CONST D3DXVECTOR4 *pLight, CONST D3DXPLANE *pPlane);参数:pOut [in, out] 指向D3DXMATRIX 结构的操作结果矩阵。 pLight [in] 指向D3DXVECTOR4 结构的光线位置向量。 pPlane [in] 指向D3DXP
阅读全文
摘要:enum的秘密<一>:enum是“用户自定义类型” 呵呵,enum在实际中应用比较少,所以你会忽略它。但是,在这里,我告诉你,enum 和 struct、class一样,都是用户自定义类型。 对呀!enum是用户自定义类型,他有数据成员,还有成员函数!For example: enum e{a=1 , b=2 , c=4};那么: 001: enum e e1; //enum e不是对象,它是类型,e1才是类型enum的对象! 002: e e1; //e是类型enum e的简写哦! 003: e1 = 1; //绝对的错误!int怎能赋值给一个用户自定义类型 004: e1 =
阅读全文
摘要:printf的格式控制的完整格式:%-0m.nl或h格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少。②-:有-表示左对齐输出,如省略表示右对齐输出。③0:有0表示指定空位填0,如省略表示指定空位不填。④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。---------------------------------------格式字符格式字符用以指定输出项的数据类型和输出格式。①
阅读全文
摘要:From:http://www.gamedev.net/community/forums/topic.asp?topic_id=324643Graphics Engines Ogre 3D Nebula Device Jad (formerly Haddd)Irrlicht Haaf's Game Engine (hardware accelerated 2D games engine)Axiom 3D (OGRE for .NET)TrueVision Revolution3D Genesis3D Crystal Space 3D Panda3D Quake 3 Source Cod
阅读全文
摘要:我从Decoda刚发布就一直关注着,这个工具可以注入到宿主程序内对lua脚本进行调试,还可以设置断点观察变量的值,功能非常强大。 下面我介绍一下使用方法。 首先找到一个使用了lua的程序,我这里用wireshark举例,这是个很好很强大的网络截包工具,wireshark内部使用了lua。没有wireshark的请下去google一下并下载安装,此为开源软件。 调试使用lua的宿主程序有两种启动方式,一种是从Decoda启动宿主程序,另一种是先启动宿主程序然后用decoda注入。 本篇文章将介绍如何从Decoda启动宿主程序 启动Decoda并点击Debug目录下的StartDebuging,弹
阅读全文
摘要:1、http://www.unknownworlds.com/decoda,这个工具可以注入到宿主程序内对lua脚本进行调试。2、有2种方式对lua进行调试从Decoda启动宿主程序a、project菜单中的Settingsb、在commond中填入你要运行的宿主程序。点击okc、用它打开lua脚本设置断点。Decoda 中选择Start Debugging下面是简单的例子。====== main.cpp ==================#include <iostream>#include "luaDebug.h"using namespace std;i
阅读全文
摘要:1、非模态对话框和父窗口共享当前线程的消息循环2、模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口。模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发送消息,父窗口还是可以接收得到。3、调用模态对话框的窗口处理函数会被阻塞,但是新的消息循环仍然可以调用父窗口的消息处理函数,所以,发送给父窗口的新消息仍然可以被及时处理。
阅读全文
摘要:(工作较忙, 趁着圣诞节假期,希望能完成约束分析这部分)物理引擎中最重要的两大环节一个是碰撞检测,其次就是约束分析,约束分析用到了大量的刚体力学中的基础知识,以及PGS这样的数值计算算法,约束构成主要是根据约束类型来计算两个连接对象的jacobian矩阵,配合shape计算转动惯量,来更新相互连接的对象的位置、速度, 来模拟连接对象受力的效果。约束包含基本的6种,可以衍生出更多,每一种都有各自的jacobian矩阵,这块可以参考文献《Stable, Robust, and Versatile Multibody Dynamics Animation》这里不做赘述。在基本的计算之外还要加入纠错,
阅读全文
摘要:在bullet中一个非常普遍的应用是 针对两个物体发生碰撞时调用开发者自己提供的回调函数比如球体碰撞到另一个球体 发出声音下面是一个例子, 场景中有3种物体 球(动态),地板(静态),墙壁(静态)球碰到墙和地板发出的声音不同。所以需要设置这三种对象为不同类别,利用 collisionobj的userpointer来完成int objclass[3] ={0,1,2};boxBody->setUserPointer(&objclass[0]);ground->setUserPointer(&objclass[1]);wall->setUserPointer(&a
阅读全文
摘要:接着上次关于Dbvt得分析,不过漏掉了一个比较重要的函数function btDbvt:: collideTTpersistentStack, btDbvt::collideTT * btDbvt:: collideTTpersistentStack. 负责进行两个dbvt子树的比较,找出两个子树中重叠的节点对,基于一个全局栈(一个成员变量实例) * btDbvt::collideTT. 负责进行两个dbvt子树的比较,找出两个子树中重叠的节点对,但是基于的是一个局部栈(函数调用结束则释放)。 * btDbvt::collideTV. 负责在一个树中搜索和对应包围体重叠的节点。btDbvt::
阅读全文
摘要:光线与AABB 相交检测:这是一个非常经典的问题, <<real time collision detection>> 5.33章节有非常详尽的讨论。下面是光线的方程 t是可变参数, P是光线的起始点 RayFrom, d是光线的方向向量下面这个是平面的方程 向量n是平面的法向量,所以如果光线与任何一个平面相交,应该有如下等式对于AABB来说是六个平面, 每个面的法向量为(0,0,1)(0,1,0) ..... 总之三个坐标有两个是0,另外的一个是1或者-1AABB同时是3个平面槽的交集, 光线与AABB最多有2个相交点,一个是前景点,一个后景点,分别与两个平面相交。特
阅读全文
摘要:DBVT 在bullet 引擎中是很基础且重要的一个数据结构,本质上是一个可以动态更新的AABB树。在bullet的远距阶段是很高效的碰撞检测数据结构(比较OOB,K- DOP)。是组成dbvtbroadphase的重要成员。首先看看树中节点的定义view plaincopy to clipboardprint?struct btDbvtNode { btDbvtVolume volume; // point to the bounding volume btDbvtNode* parent; // point to parent node DBVT_INLINE bool isleaf()
阅读全文
摘要:开始阅读前可以先浏览一下之前框架分析在物理模拟的场景中, 一个节点首先应该具备2种属性物理属性 包含 质量,速度,惯性,加速度,角速度,约束,摩擦系数 等 几何属性 形状, 包围体层次,碰撞检测类型掩码。world 变换。 物理属性大部分都在collosionObject 和rigidObjec 这样的类之中。几何属性则又一次被细分为包围体层次和形状,碰撞检测类型掩码。为了进一步介绍Dbvt的核心函数 btDbvt::collideTV必须首先引入btDbvtProxy。btDbvtProxy 继承自 btBroadphaseProxy。view plaincopy to clipboardp
阅读全文
摘要:原创帖子, 转载请注明出处,作者信息. 这个是自己分析bullet的代码过程中的笔记,比较简陋, 希望抛砖引玉, 欢迎板砖作者: 马良 (http://www.iphonephysics.com/ ) (此blog需Over GW)//应朋友要求在最后附上书目 理论准备:本科的数学分析,理论力学,线性代数。 尤其是理论力学中的朗格朗日动力学部分 最好能回忆起来。 碰撞检测上面列的两本书的内容就足够了,如果进一步挖掘需要看 计算几何方面的书 补一个架构图 引自[1]的12页,其中的STC即为上次分析中的islandmanager 碰撞响应的分析 约束分类:可积约束,不可积约束 ,摩擦力(见[1]
阅读全文
摘要:在制作我的demo的过程中出现这样一个问题,人物跳起来,我如何判断他是什么时候落地的,还有落地的问题,ogrebullet中我没有找到相关的处理,我这里只能使用bullet的碰撞回调函数了,下面是我的做法,如果有哪位有更好的方法,请告诉我,我在这里谢谢了。//OgreBulletDynamics::DynamicsWorld *mWorld;// myInternalTickCallback是一个回调函数typedef void (*btInternalTickCallback)(btDynamicsWorld *world, btScalar timeStep);mWorld->get
阅读全文
摘要:对于角色的控制一个问题就是,是否使用角色的模型?如何控制人物的行走,旋转等?ogrebullet没有角色控制相关的使用,那么只有从bullet那里了,进行控制了在bullet物理引擎的介绍中有关于角色控制的一些资料,在bullet源代码中应该可以找到一个pdf文件。里面介绍的bullet的一些使用,那么第9节 Action:Vehicles & Character Controller 里面就介绍了一些角色控制相关的:角色或NPC可以使用一个囊状、球体或者其他相撞来代替,不想让他自动旋转,可以把angular factor 设置为0,等等,自己去看吧,下面是我自己使用ogrebulle
阅读全文