Ogre 一句话技巧
[ 2007-05-28 20:40:02 | 作者: Admin ]
如有转载,请注明:
http://www.azure.com.cn/
1.所有需要挂在SceneNode上的user-object, 都需要从MovableObject来继承,比如一个最典型的应用是 3DSoundSource.
2.Ogre中RenderQueue的相关标号,标号越小的其最先渲染。
Background - Queue 0
Skybox - Queue 20
World Geometry - Queue 30
MovableObjects - Queue 50
Overlays - Queue 100
比如我们需要在Overlays上显示粒子效果,
我们就需要把粒子对象(其就是一个MovableObject)的RenderQueue,设置
大于100,比如101。
3.Material ...
阅读全文...
http://www.azure.com.cn/
1.所有需要挂在SceneNode上的user-object, 都需要从MovableObject来继承,比如一个最典型的应用是 3DSoundSource.
2.Ogre中RenderQueue的相关标号,标号越小的其最先渲染。
Background - Queue 0
Skybox - Queue 20
World Geometry - Queue 30
MovableObjects - Queue 50
Overlays - Queue 100
比如我们需要在Overlays上显示粒子效果,
我们就需要把粒子对象(其就是一个MovableObject)的RenderQueue,设置
大于100,比如101。
3.Material ...
阅读全文...
绝对不要重新定义继承而来的缺省参数
[ 2007-05-27 10:37:42 | 作者: Admin ]
看下面这个例子: 下面是调用例子: 我们的本意是想输出1,可是结果却是输出0!
不用惊奇,书中给出了答案:虚拟函数系动态绑定(dynamically bound),而缺省参数值却是静态绑定(statically )所以,<<Effective C++>>第38条告诉我们: 绝对不要重新定义继承而来的缺省参数。
class CBase
{
public:
virtual void Test(int iTest = 0) const = 0;
};
class CDerived : public CBase
{
public:
void Test(int iTest = 1) const { cout << iTest << endl; };
};
{
public:
virtual void Test(int iTest = 0) const = 0;
};
class CDerived : public CBase
{
public:
void Test(int iTest = 1) const { cout << iTest << endl; };
};
CBase *p = new CDerived;
p->Test();
p->Test();
不用惊奇,书中给出了答案:虚拟函数系动态绑定(dynamically bound),而缺省参数值却是静态绑定(statically )所以,<<Effective C++>>第38条告诉我们: 绝对不要重新定义继承而来的缺省参数。
降低编译时间的几条方案
[ 2007-05-25 20:27:27 | 作者: Admin ]
关于include的原则最多,因为包含头文件相当于将代码复制到本文件来编译,而头文件又经常是用来被别人包含的,所以工程文件多了,每个文件都有include链(包含的文件又include了其他文件),该链条不会止步于你工程,而会延伸到你所有使用的第3方库里面。
A.能够去掉的include就去掉。
说明:1.代码编写过程中或多或少都有一些历史遗留的不必要的头文件包含在你的文件里面,找到他们并去掉之。
2.去掉include链里面重复的include 。
B.能够在cpp里面include的头文件不要在头文件里面include。
说明:尽量去掉每个cpp会被串起来的头文件膨胀的机会。
C.能够用前向声明的就不要include,头文件里面也是一样
...
阅读全文...
A.能够去掉的include就去掉。
说明:1.代码编写过程中或多或少都有一些历史遗留的不必要的头文件包含在你的文件里面,找到他们并去掉之。
2.去掉include链里面重复的include 。
B.能够在cpp里面include的头文件不要在头文件里面include。
说明:尽量去掉每个cpp会被串起来的头文件膨胀的机会。
C.能够用前向声明的就不要include,头文件里面也是一样
...
阅读全文...
GUIDELINE 26 : Never #include a header when a forward declaration will suffice
[ 2007-05-23 22:43:05 | 作者: Admin ]
使用前置声明取代包括头文件
在这里,我自己总结了可以使用前置声明来取代包括头文件的各种情况和给出一些示例代码。
首先,我们为什么要包括头文件?问题的回答很简单,通常是我们需要获得某个类型的定义(definition)。那么接下来的问题就是,在什么情况下我们才需要类型的定义,在什么情况下我们只需要声明就足够了?问题的回答是当我们需要知道这个类型的大小或者需要知道它的函数签名的时候,我们就需要获得它的定义。
假设我们有类型A和类型C,在哪些情况下在A需要C的定义:
阅读全文...
在这里,我自己总结了可以使用前置声明来取代包括头文件的各种情况和给出一些示例代码。
首先,我们为什么要包括头文件?问题的回答很简单,通常是我们需要获得某个类型的定义(definition)。那么接下来的问题就是,在什么情况下我们才需要类型的定义,在什么情况下我们只需要声明就足够了?问题的回答是当我们需要知道这个类型的大小或者需要知道它的函数签名的时候,我们就需要获得它的定义。
假设我们有类型A和类型C,在哪些情况下在A需要C的定义:
- 1.A继承至C
- 2.A有一个类型为C的成员变量
- 3.A有一个类型为C的指针的成员变量
- 4.A有一个类型为C的引用的成员变量
- 5.A有一个类型为std::list<C>的成员变量
- 6.A有一个函数,它的签名中参数和返回值都是类型C
- 7.A有一个函数,它的签名中参数和返回值都是类型C,它调用了C的某个函数,代码在头文件中
阅读全文...
Depth Of Field With Cg DEMO(Cg实现景深,附代码)
[ 2007-05-15 17:33:53 | 作者: Admin ]
实现方法:
景深其实就是对blur filter的一种改进,使其对每个像素的blur程度都有所不同,
而blur的依据就是场景的深度和当前焦距之间的关系。
1.渲染深度到纹理。
相关SHADER如下:
//AdaptDepthVS.cg
//取得顶点的深度值,并且插值到PS中去
uniform float4x4 modelViewProj : state.matrix.mvp;
uniform float farclip; //远裁剪面距离
void main(float4 inPos : POSITION,
out float4 oPos : POSITION,
out float oDepth : TEXCOORD0)
{
//取得顶点的深度值,并且插值到PS中去
uniform float4x4 modelViewProj : state.matrix.mvp;
uniform float farclip; //远裁剪面距离
void main(float4 inPos : POSITION,
out float4 oPos : POSITION,
out float oDepth : TEXCOORD0)
{
阅读全文...
一个标准的Blur Filter演示
[ 2007-05-14 13:51:12 | 作者: Admin ]
其实其PS代码非常简单,就是个遮罩算法。
相关代码摘录,
PS代码:
//Blur Filter
//www.azure.com.cn
uniform float gViewportInvX;
uniform float gViewportInvY;
uniform sampler2D gTexture;
float4 main(float2 texCoord : TEXCOORD0) : COLOR
{
float4 col = float4(0,0,0,0);
col+=tex2D(gTexture,texCoord + float2(-1.0*gViewportInvX ,-1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord
//www.azure.com.cn
uniform float gViewportInvX;
uniform float gViewportInvY;
uniform sampler2D gTexture;
float4 main(float2 texCoord : TEXCOORD0) : COLOR
{
float4 col = float4(0,0,0,0);
col+=tex2D(gTexture,texCoord + float2(-1.0*gViewportInvX ,-1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord
阅读全文...
写了个简单的Profiler
[ 2007-05-11 18:52:35 | 作者: Admin ]
代码如下: ...
阅读全文...
//author : azure
//www.azure.com.cn
#include <windows.h>
#include <mmsystem.h>
#include <map>
#pragma comment(lib, "winmm.lib")
struct RunCount
{
size_t Count;
size_t TotalTime;
};
std::map<size_t, RunCount> m_profilerStatistic;
class Profiler
{
public:
Profiler(size_t profilerID, size_t timesAvg, char* outputFile);
~Profiler();
private:
size_t m_profilerID;
//www.azure.com.cn
#include <windows.h>
#include <mmsystem.h>
#include <map>
#pragma comment(lib, "winmm.lib")
struct RunCount
{
size_t Count;
size_t TotalTime;
};
std::map<size_t, RunCount> m_profilerStatistic;
class Profiler
{
public:
Profiler(size_t profilerID, size_t timesAvg, char* outputFile);
~Profiler();
private:
size_t m_profilerID;
阅读全文...
一个智能指针的实现(代码)
[ 2007-05-11 16:24:09 | 作者: Admin ]
通过仔细的阅读此代码,
可以了解引用计数在share_ptr中的使用。
share_ptr中通过包装一层share_data,
share_data来包装真实的指针,
当智能指针被赋值後,引用计数++,release()後引用计数--.
最后当引用计数0为後,由share_data代为删除对象。 ...
阅读全文...
可以了解引用计数在share_ptr中的使用。
share_ptr中通过包装一层share_data,
share_data来包装真实的指针,
当智能指针被赋值後,引用计数++,release()後引用计数--.
最后当引用计数0为後,由share_data代为删除对象。
实现(代码)一个智能指针的实现(代码)2006-10-27 0:43:11一个智能指针的实现(代码)2006-10-27 0:43:11一个智能指针的实现(代码)
File: shared_ptr.h
///////////////////////////////////////////////////////////////////////////
//
// template class shared_ptr
File: shared_ptr.h
///////////////////////////////////////////////////////////////////////////
//
// template class shared_ptr
阅读全文...
c++中的explicit关键字
[ 2007-05-11 14:42:00 | 作者: Admin ]
c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?
如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: 在上面的代码中编译器自动将整型转换为MyClass类对象,实际上等同于下面的操作: 上面的所有的操作即是所谓的"隐式转换"。
如果要避免这种自动转换的功能,我们该...
阅读全文...
如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class MyClass
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
{
public:
MyClass( int num );
}
....
MyClass obj = 10; //ok,convert int to MyClass
MyClass temp(10);
MyClass obj = temp;
MyClass obj = temp;
如果要避免这种自动转换的功能,我们该...
阅读全文...
Torque 中如何实现聊天消息分发
[ 2007-05-10 15:20:27 | 作者: Admin ]
Torque 的设计就直接建立在C/S结构上,所以它自然对网络有着良好的支持,
所以实现一个聊天消息的群发是非常方便的。
假设在客户端脚本中,有这样一个函数 显而易见,当用不同的参数调用此函数的时候, %msg会被赋予不同的内容,
CommandToServer是用来客户端跟服务器通讯的命令,
'TellEveryone'指明在服务器执行的回调函数是什么,然后后面就是需要传输给服务器信息的内容。
...
阅读全文...
所以实现一个聊天消息的群发是非常方便的。
假设在客户端脚本中,有这样一个函数
function Yell(%value)
{
switch$(%value)
{
case 1:
%msg = "Hello!";
case 2:
%msg = "Thanks!";
case 3:
%msg = "Nevermind!";
}
CommandToServer('TellEveryone', %msg);
}
{
switch$(%value)
{
case 1:
%msg = "Hello!";
case 2:
%msg = "Thanks!";
case 3:
%msg = "Nevermind!";
}
CommandToServer('TellEveryone', %msg);
}
CommandToServer是用来客户端跟服务器通讯的命令,
'TellEveryone'指明在服务器执行的回调函数是什么,然后后面就是需要传输给服务器信息的内容。
...
阅读全文...












