来学校十天了,空空虚虚的一样
好像不知道要作什么,又有好多事要去做。很想去做图像识别,好好研究一下算法。又想把在图形学方面多做些努力,毕竟是理想啊。回想起来似乎一个暑假只做了一个简单的分形树,做来做去还是那个东西。
有时间的话可以好好看一下NeHe的教程,NeHe教程后面还是有些高级内容的。还有OpenGL红宝书也应该重看一下,对渲染管线根本没有个概念。C++也是.... ,C style,出了封装就没别的了。还有图形学,图形学还是比较重要的。这些书手上基本上都有,只是没有时间看一样,整天坐在电脑面前也好像没做什么。该努努力了。课设也要重视一下,做得深入一点。还有一本《Google 成功七堂课》,有时间也要好好看一下。
今天去NeHe的网站转了一圈,NeHe的贡献远不止几课教程那么简单,NeHe的下载页上有很多人,利用他的框架做出DEMO发出来,有些只是简单的更改,但是有些就非常cool了。做图形这东西,仅有技术还是不够的,要有创意,要懂点审美,art 。不过提供源代码的并不多,这个算是遗憾了,只从NeHe学到了一点技术,没学到NeHe的精神,共享精神。不管怎么说,又很多人开始爱好三维图形或者说Game Coding 了。
post:也许是有点贪玩,但是学东西还是需要一定的时间的,太小看这个时间了
xophiix终于回来了。要真的做点事了。还是很高兴的
2006年8月31日
学,然后知不足
2006年8月28日
C/C++中精确计时的两个方法(再加一个)
点击下载源程序 (8k),(放在我的google pages 上的)
算了,不用去下载了,好麻烦的。
for(int testIndex = 0; testIndex < testTimes; testIndex++)
{
//do something<br>
DoSomething();
}
timer -= clock();
printf("totol time:%ld,run one time cost:%f"
, timer
,((float)timer)/testTimes );
还有一种,既精确又通用的。精度还不大清楚
LARGE_INTEGER startTime;
LARGE_INTEGER endTime;
QueryPerformanceFrequency(&startTime);
//Do something but not evil
DoSomeThing();
QueryPerformanceFrequency(&endTime);
float elapsedTime = (float)endTime.QuadPart
- (float)startTime.QuadPart;
剩下的就不说了
简单的三维树生成及渲染
这个暑假写的学的东西,最近整理起来,刚刚学OpenGL,很多方面做得都不好。
压缩包里有介绍
DEMO下载
源文件下载
pre: 先反省一下,以前写的确实过于简略,代码又没有设么注释。感谢EmilMatthew的话,让更多人受益 源代码正在改写,以前变量命名很随意,反正很不清晰,更提不上elegant了。另一方面也在进行优化
核心算法描述:(实际上并不算是什么算法) 树主要分两部分:树枝和树干。树干使用二次曲面圆柱(gluCylinder,注意这个圆柱是可以上下半径不等的)近似,树叶就贴一片纹理。 树的绘制是递归进行的,也就是说:在一段树桩上接上三段树枝所形成的东西仍然叫做树(DEMO里每一段树枝上都有三段小树枝 ,递归的深度是四,可以自己调整)。用代码来写的话:
void DrawTree(int depth)
{
DrawStem(); //绘制树桩
if (2 < m_ndepthtop ="=">//未绘制到顶层的话继续递归绘制
MoveToStemTop(); //移动到树桩顶部(注意圆柱体是没有上下表面的,所以要用树枝挡住)
DrawTree(depth + 1); //绘制第一个树枝
MoveToProperPos(); //移动到适当位置(glPushMatrix();glRotatef();glTranlatef();...)
DrawTree(depth + 1); //绘制第二个树枝
MoveToProperPos(); //移动到适当位置
DrawTree(depth + 1); //绘制第三个树枝
}
绘制函数可以这样被调用:DrawTree(1); m_nDepth指的是树的递归层数,加深一层速度会慢三倍,但是可以得到更繁茂的树。 DEMO里只有四层,只是用了很大的叶子去掩盖,并且一片纹理图上就有五片叶子。不过总比一棵树上贴五片树枝纹理图,然后用billboard 好的多,很多著名游戏都是这么干的。
post: 还有一点别的事情,树的顶端树枝很细,所以我并没有使用二次曲面进行模拟,而是使用了长方体。这样会稍微快一点。 比较粗的树干上通常是没有叶子的,所以绘制的过程中有相关的判断,地层的树枝上不会有叶子。 我用AMD CodeAnalyst 对程序进行了分析,可惜并没有找到真正的热点。对于代码优化来讲,算法上的优化通常会更优。 在我的机器(AMD Sempron 2800+ 1.6G,512MB,6600LE 128MB)上,把绘制树的过程做成显示列表后,调用一次列表的时间大约为0.85ms ,使用近似之后可以节约大约0.04ms。目前对我来说主要问题还是效率,我希望效率可以提升一倍,反正要比导入模型更快。 最近主要针对的是消除递归,树是递归定义的,希望消除递归能提高效率。主要方法还是用栈,二叉树和三叉树消除递归好像差不多。 还有隐藏面消除,显卡也会完成隐藏面消除,我希望要的结果是不需要绘制的面(或者点)的信息就不要传给显卡,估计自己做可能倒不如传给显卡。 还有更快的圆柱体绘制方法。 还有使用更小更精巧的纹理,看WAR3的纹理图给了我一点启发,一张256X256的图片巧妙的交错存储了两种植物的纹理。30多个面,50多个顶点 做出来的植物也是非常逼真,不过WAR3并不是以真实感为卖点的游戏,其实树做的就很搓,实时性可能更重要一些。 如果有人对这个感兴趣的话可以在我的blog上留言。
注:递归消除部分的代码已经写完,但是效率并没有得到提高
标签(分类) Graphics/OenGL
一个不错的WAR3 资源查看器
最近在国外的网站上发现的,因为正想把魔兽里的一个模型加到自己的一个东西里。以前也用过一些这类的东西,具体名字就不说了,但是这个功能是我所用过的最好的。对MPQ文件的分析能力很强。有一点新发现,原来蜘蛛用来攻击的是小蜘蛛。
还有那个草基本上只用了一块纹理,256 X 256的就拼出来一个很有立体感的东西。
War3ModelEditor 下载
它的网站上是有源码的:http://magos.thejefffiles.com/War3ModelEditor/
还有单独的导入MD2和MS3D的文件,找了好久的东西。
简单的素数表获取:埃拉托色尼筛
今天看到一个算法,集合的伪随机遍历。倒是还是不很明白,不过它需要获取素数表 比如说3是一个素数,6(3*2),9(3*3),12(3*4)......就都不是素数,所以prime[6],prime[9],prime[12] 比如说要找从1 ~ 999之间的素数 /* prime.c #include <stdio.h> #define UPER_LIMIT 1000 int prime[UPER_LIMIT]; /* In fact in can be an array of bool in C++ int main()
,想起以前的一个算法:埃拉托色尼筛。
占用空间比较大,但是速度还过得去,基本上没用到乘法和除法。 还有就是不能检验单个素数。
就都被标记为0
当primeIndex增大到6的时候 ,因为prime[6]已经被标记所以 ,prime[12]不会被再次标记。
written by yaker 2006.08.07
*/
#include <math.h> /* sqrt(); */
#include <conio.h> /* getch(); useful for Dev C++ */
,using pascal it even cost only 1000 bits */
{
int primeIndex,anotherIndex;
/* Initialize*/
for(primeIndex = 2;primeIndex < UPER_LIMIT;primeIndex++)
prime[primeIndex] = 1;
/* Check */
for(primeIndex = 2;primeIndex <= sqrt(UPER_LIMIT);primeIndex++)
{
if(prime[primeIndex])
{
anotherIndex = primeIndex * 2;
while(anotherIndex < UPER_LIMIT)
{
prime[anotherIndex] = 0;
anotherIndex += primeIndex;
}
}
}
/* OutPut */
for(primeIndex = 2;primeIndex < UPER_LIMIT;primeIndex++)
{
if(prime[primeIndex])
printf("%8d",primeIndex);
}
/* Pause */
getch();
return 0;
}
indent:代码整理工具
indent是C语言(不包括C++)的代码整理工具
这些日子在做课程设计,老师给的那个代码示例实在是过于dirty,所以找到了这个东东
indent有很多参数,所以可以依照个人习惯来定制,默认的是gnu风格,可选的风格还有K&R和Orign
下载
有一个叫MyIndent的工具,有翻译好的indent参数,而且可以预览。一点小小的不足是预览时Tab是八个空格,反正我常用四个,不大习惯。还有主界面不可以最大化。但是它仍然是很好的工具。
Indent的存在也许是一件很奇怪的事情,你需要它通常是你拿到了一段别人写的很乱的代码。如果自己注意代码风格的话是不需要它的。关于代码风格有非常多的文章,《代码大全》有一章的内容。
下载的包里含有CodeFormator.vb文件,可以把indent整合进VS.NET 2003。还需要别的文件都在MyIndent的包里,这个是作者忘记放进去的。我试着按作者的说明整合了,但是失败了。
MyIndent 能整合到 Visual Studio.NET 2003 中,通过宏代码调用 API 的方式格式化当前编辑的文件或选中的代码块,使用方法是打开宏 IDE(按快捷键Alt+F11),添加 CodeFormater.vb 文件到 MyMacro 中,修改其中的“I:\Richard\Programs\MyIndent\MyIndent.dll”和“I:\Richard\Programs\MyIndent\~out.tmp”两个字符串,替换成实际的路径并保存,关掉宏 IDE,打开宏资源管理器(按快捷键Alt+F8),运行 FormatFile 或 FormatSelection 宏便可。还可以为宏指定快捷键,使用起来更方便。
可以使用添加外部工具的方法,工具->外部工具 标题,命令:.....\indent.exe 参数:-bap -bbo -bl -bli0 -bs -c41 -cbi4 -cd41 -cp41 -di8 -fc1 -i4 -l100 -lc100 -lps -ncdw -nce -nlp -npcs -nprs -npsl -nsc -saf -sai -saw -sc -sob -ts4 -ut $(ItemPath) 路径:$(ItemDir)。VS.NET 2003 的宏约定与VC 6不同
还有一个更易用一点的astyle,可以为C,C++,Java整理,当然也丧失了更强的可定制性
IE7的问题
刚刚装了IE7 RC1(真是晚啊),IE7还是又很大改进的,多页面,广告拦截,RSS支持。。。
不过GMail无法打开了,解决办法就是https://mail.google.com
还有就是GMail老是被封,当然是开了GTalk。只是以前用Maxthon没怎么被封过。
只好将就一下了,还是很喜欢IE7的。^_^
不过因为什么我也不清楚。以前听说FireFox有这种问题,没听说IE也有 。
Blogger本身也出了点问题,总是重复登陆。跑到国外的论坛上看了一下,这个问题是比较普遍的,我觉得是cookies的问题,所以只好把blogger的所有cookies放行。也有传言是因为ZoneAlarm,我觉得可能不大,但是我用的也是ZA.