平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

朋友已走

在福州这最寒冷的日子里,一个曾经的同学与朋友,走了.
让我们珍重生命的美好和顽强,锻炼身体,健康第一.

朋友啊,天堂好吗?
------------------------------------------------------------------------------------
转自:
http://www.fzhome.com/index.asp?boardid=1086&page=1

                                                                        记忆碎片             
                                                                                                                                                   李威远
记得1997年的时候,我被迫截掉股骨,那时真的像掉到冰窟里一样,那年我才十八岁。风华正茂的年龄,在省里最好的高中,我有很多梦想——爱情、学业、事业,我什么都没有体会过,什么都还刚刚开始,而我就残疾了,似乎什么都结束了。

  在这之前,我为自己矮小的身材苦恼,而现在呢,我是个瘸子了,永远远离了我心爱的篮球场、羽毛球场,永远告别了我热爱的登山和野营。爱情更是遥不可及,作为一个残疾人,社会上的人会怎么看待我呢?

  这种烦恼终于在我考上大学后结束了,不是因为治好了,而是我被确诊为肺癌晚期,没有手术和化疗的机会了,所有的医生都说我活不过几个月。这个时候,我又开始怀念起残疾的那段日子是多么幸福,生命无忧,安然而卧,拄着拐杖到外边走走还有神清气爽的感觉。而现在,死神紧紧相依,生命随时都有可能结束。

  这个时候才感到生命是如此的甜美,可以自由呼吸、自由自在地走动。过去的日子只能让人怀念,我没有了未来,能把握的只有现在,分分秒秒地把握今天,我不为昨天后悔,也不为明天忧愁,我只为今天获得的友情和信赖而快乐。

  就这样,很快7年就过去了,7年时间里,我读完了本科、攻读硕士研究生并顺利取得了硕士学位。我每天都过得充实,在别人看来理所应当拥有的,我都没有,但是我一点也不比残疾之前消沉。肿瘤慢慢地在发展,呼吸渐渐地微弱,心脏缓缓地无力跳动,这些都在意料之中。

  在这7年中,我体会到的幸福很多,一般人不会因为无法呼吸而数个昼夜不眠,而我有这个机会,当可以躺下休息时,美妙的感觉无法形容。去年我的三大愿望是:可以不喘气地说话,可以不喘气地走路,可以平躺下来睡觉。今天我仍为实现我的这三大愿望努力着。

  很多人不快乐,没有幸福感,仔细观察,因为他们心里都在念着别人的拥有:朋友有房有车了,我没有;朋友爱情事业有成,我没有……他们很少去想想自己的拥有:我拥有一个相亲相爱的家庭,我拥有生命,我可以自由自在地呼吸……在我看来,你们都是幸福的,你们都可以自由地说话走路,累了可以躺到床上休息,而我不行;在我看来,我也是幸福的,我没有整日整夜的疼痛,我可以打字,我可以看书,我不需要天天卧床不起,我的生活尚能自理,我耳聪目明,可以享受到世界上美丽的风景,动人的乐章……

  我想对千千万万的残疾人同胞们说,坚强地快乐地生活下去,因为我们还有自己把握的生命时光;我想对千千万万的癌友们说,坚强地快乐地生活下去,医学在发展,希望就在前方;我想对既有残疾又得了癌症的朋友们说,这是一种锤炼。平常人能做到的,我们也能做到,而且可以做得更好。

  我的生命在一天天地延续,而且令我高兴的是,多年来一直都没有办法医治的肿瘤终于有了对付它的办法———氩氦刀。这得益于我在一个医学BBS上的求助,虽然多年以来有想到过未来的某天随着科技的进步,或许会有办法治疗自己的病,但这一切来得突然,一点心理准备和资金上的准备都没有。第一次手术已经做了,人感到舒服了许多,呼吸顺畅了,也可以吃东西了……

posted @ 2005-12-08 22:47 linghuye 阅读(681) | 评论 (0)编辑 收藏

The future

This edition comes 28 years after one of the milestone papers in the field of computer graphics, "A Characterization of Ten Hidden-Sureface Algorisms" by Sutherland, Sproull, and Schumacker, published in 1973. Their 55-page paper is an incredibly thorough comparison of 10 differect algorisms. What is interesting is that the algorithm described as "ridiculously expensive," the brute-force techniche not even dignified with a researcher's name and mentioned only in the appendices, is what is now called the Z-buffer. This eleventh hidden surface technique won out because it was easy to implement in hardware and because memory densities went up and cost went down. The research done by Sutherland et al. was perfectly valid for its time. As conditions change, so do the algorithms, It will be excuting to see what happens in the decades to come. How will it feel when we look back on this current era of rendering technology? No one knows, and each person can have a significant effect on the way the future turns out. There is no one future , no course that must occur. You create it.

The best way to predict the future is to create it.
                                                                   -Alan Kay

I program my home computer, beam myself into the future.
                                                                   -Kraftwerk
                                                                          

posted @ 2005-12-05 13:12 linghuye 阅读(475) | 评论 (0)编辑 收藏

Horizon Occlusion Culling

NND,图形学怎么有这么多的算法!一个接着一个,没完没了.一堆的论文要看,越学越难,越学越无知.看着国外的好书只能流口水,怎么赶得上人家的水平啊,做人的差距,咋就这么大呐,灰心寽.

1. How to walk through the elements in the scene in front-to-back ordering?
2. How to representation for the visibility occlusion horizon?
3. How give out a simplified representation of scene objects to be used for calculating occlusions with the horizon, ie, to test if the element is under the horizon?
4. How to add the visible elements' affection into horizon line?

Reference:
http://rivit.cs.byu.edu//a3dg/publications/horizonCullingVISFinal.pdf
http://www.cs.tau.ac.il/~dcor/online_papers/papers/visibility-survey-ieee.pdf
游戏编程精粹4,P424,翻译的极烂(把实数译成真正的值),原作者的代码也烂,书中说的这个容易,那个容易,一到具体代码就不行了,到处hack,连视点从前到后遍历都不能保证.
http://www.cs.lth.se/home/Tomas_Akenine_Moller/pubs/i3d2001.pdf
http://graphics.stanford.edu/courses/cs248-05/real-time-programming/moller-cs248-01-lecture.pdf
http://www.cs.sun.ac.za/~henri/advgfx.html

12.23
终于把水平线裁减算法的Bug解决了,开贴纪念.
主要是原游戏编程精粹4的水平线算法代码有无数的Bug,Demo控制高空镜头有意地避开一些Bug,强烈鄙视.

posted @ 2005-11-29 00:31 linghuye 阅读(3249) | 评论 (22)编辑 收藏

场景裁减方案估计

0.使用天空球包围整个世界,使用雾限制可控远景.
1.地形裁减:
  1.使用四叉树算法对MapArea->AreaChunk逐层进行相对镜头的可见性裁减.
  2.在1过程中,对镜头内的地形进行水平线扫描剔除.
  2.然后镜头裁减完的区域必然是连续区域,对此连续区域作ROAM算法下的LOD处理,近细远粗.
2.模型裁减:
  1.基于上述地形四叉树裁减下作基本的每一个模型的裁减,实践测试结果表明收益大于测试成本.
  2.距离裁减:以镜头为中心画圆,处于远景雾外的模型不作渲染,模型进雾后会逐步显示,这样不会有poping缺陷.
  3.不采用模型LOD,数据制作过于复杂,控制复杂,加大内存需求,也有poping缺陷,优点不明显.
  4.在地形水平线裁减中剔除物体.
3.进入BSP室内场景后的裁减.

posted @ 2005-11-25 17:06 linghuye 阅读(1774) | 评论 (1)编辑 收藏

单体对象行为守则

1.单体必须有Setup()和Destroy()函数
2.单体不得在构造函数中分配资源,不得在析构中释放资源,应显式使用Setup和Destroy函数,注意Destroy函数要clear清空stl容器.
3.内存检查器单体可以凌驾于此规定之上,不受约束.
4.由于单体自身的释放由C++机制保证,所以内存检查器单体不用负责其他单体自身的释放问题.
5.由于其他单体在内存检查器单体之前构造,必然在内存检查器单体之后析构,对内存检查器的逻辑无影响,所以允许其他单体在内存检查器单体之前构造,不保证或规定单体间的初始化顺序.
6.由于强制Setup和Destroy的调用,内存检查器单体将严格监督其他单体在其内部的资源的分配释放出现的问题.
7.一个2进制模块分配的内存不得在其他模块释放.
8.内存检查器单体由程序员直接负责监督.

推论:
1.如内存检查器单体报警则必有模块违反上述准则.

posted @ 2005-11-17 21:30 linghuye 阅读(444) | 评论 (0)编辑 收藏

WoW骨骼动画的GLSL实现

在OpenGL.org论坛上不幸被告知VERTEX_BLEND_ARB扩展不属OpenGL核心标准,被ARB卡查掉了,Nvidia也不实现了,所以在OpenGL下要做骨骼动画只好靠Shader了,让CPU计算,效率会很惨,写写Demo还凑和.

使用指令将顶点的骨骼和权重信息作为Generic Attribute属性传入给Shader对象.
GLint indexBone = glGetAttribLocationARB(m_glPrograme, "bone");
GLint indexWeight = glGetAttribLocationARB(m_glPrograme, "weight");
glVertexAttribPointerARB(indexBone, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(MDL_VERTEX), m_arrMdlVertices[0].bones);
glVertexAttribPointerARB(indexWeight, 4, GL_UNSIGNED_BYTE, GL_FALSE, sizeof(MDL_VERTEX), m_arrMdlVertices[0].weights);
glEnableVertexAttribArrayARB(indexBone);
glEnableVertexAttribArrayARB(indexWeight);

在每帧在CPU中计算骨骼矩阵,并将计算好的骨骼矩阵数组传入Shader对象.
GLint indexBoneMatrices = glGetUniformLocationARB(m_model.m_glPrograme, "boneMatrices");
for(unsigned int i = 0; i < m_animSkeleton.m_vecBones.size(); i++)

 CM2Bone* pBone = m_animSkeleton.m_vecBones[i];
 glUniformMatrix4fvARB(indexBoneMatrices + i, 1, GL_TRUE, pBone->m_transformMatrix);
}

搞定,运行,发现wow的兽人模型竟然有128个骨骼,而N6200的shader的Uniform Matrix参数最多只给60个,还得考虑低端机器,玻璃渣是怎么做的?发现DX的实现从来就是送入硬件处理的,节省了额外的顶点内存,加快了速度,确实是不二的选择.
结论:
1.模型中的LOD是硬件LOD,即匹配给各层次的显卡使用的,最小LOD的动画都只需十几根骨骼,这对美工的要求很高.
2.可以直接传入UNSIGNED_BYTE的骨骼权重,让显卡去运算到float的mapping.
3.uniform mat4 boneMatrices[60];显卡能力不同将导致这里实际的60数值不同.
4.低端显卡不支持for循环控制流,要拆开手写.

attribute vec4 bone;
attribute vec4 weight;
uniform mat4 boneMatrices[
32];

void main()
{    
    vec4 blendVertex 
= vec4(0000);
    
    
for(int i = 0; i < 4; i++)
    {    
    blendVertex 
+= boneMatrices[int(bone[i])] * gl_Vertex * weight[i];
    }
    
    gl_Position 
= gl_ModelViewProjectionMatrix * blendVertex;
    gl_TexCoord[
0= gl_MultiTexCoord0;
    gl_FrontColor 
= gl_Color;
    
    vec4 ecPos 
= gl_ModelViewMatrix * blendVertex;
    gl_FogFragCoord 
= abs(ecPos.z);
}

修正:
1.ATI实现的GLSL实在缺德, gl_TextureMatrix不是默认单位矩阵值,而是没有定义, Nvidia下运行正常,ATI不正常.

posted @ 2005-11-14 17:38 linghuye 阅读(3544) | 评论 (2)编辑 收藏

LT Jupiter学习笔记.2701

1.核心Update驱动在Sample工程所写的ILTClientShell内
2.CClientShell是引擎内部的ClientShell概念,它的Update驱动了客户代码Sample的IClientShell的Update.
3.Render方法入口在客户代码的Update内
4.客户代码使用ILTClient向引擎下达渲染指令,ILTClient通过使用RenderStruct向渲染引擎下达渲染指令(立即完成模式).
2.LT使用C接口手法,赋值函数指针到RenderStruct的函数成员指针变量,试图避开虚接口的消耗.
6.主要渲染入口RenderCamera(ltClientShell.cpp) -> cis_RenderCamera(winclientde_impl.cpp) -> CClientMgr::Render -> d3d_RenderScene-> d3d_FullDrawScene -> 建立渲染队列-> d3d_FlushObjectQueues -> 分类别渲染各个方面的实体 -> d3d_DrawSolidModels(模型渲染) -> (drawModel.cpp) -> RenderPiece ......真是又臭又长.

7.模型骨骼变换在渲染代码里搞,DX真是方便啊(但很没个性),OpenGL就不得不写Shader了,ModelInstance -> GetRenderingTransforms -> TransformMaker,分工很细.

posted @ 2005-11-14 17:12 linghuye 阅读(388) | 评论 (0)编辑 收藏

陈易事件 - 迈入犬儒主义社会

今天刚听说陈易事件,看了天涯的帖子,对现在的陈易只有同情和理解.

金庸小说看多了,江湖的恩恩怨怨,无非打着正义的旗子,做着践踏善良的事情.
我只能告诫自己,作人最重要的是善良,而非所谓的正义和真相.正义者,胜者王侯败者宼,几千年后能感动我们的是那些人性的光芒.

罗胖子说中国现在是犬儒主义世道,确实.

posted @ 2005-11-05 19:31 linghuye 阅读(449) | 评论 (0)编辑 收藏

Blend after Texture Shader

最近被一个Blend问题搞得晕头转向,今天终于弄明白了,并坚定了许多概念.
1.OpenGL中的多重纹理Texture Shader有2条路径: 1.GL_TEXTURE_ENV_MODE控制模式 2.Register Combiner模式.
2.无论在哪条路径下,Blend机制永远发生在Texture Shader之后,并将Texture Shader的结果唯一RGBA值作为为入口操作数.
3.AlphaMap的RGB值是(1.0f, 1.0f, 1.0f)!!!.
4,wglShareLists,第一个参数是源资源空间,实际是用来ShareTexture.

posted @ 2005-10-30 22:33 linghuye 阅读(729) | 评论 (0)编辑 收藏

WoW's terrain gloss map

WoW's terrain gloss map, why they store the redundant terrain texture???
   
黄金之路


RealtimeRendering纹理贴图章节谈及这种用法,由Bushnell和Mitchell提出.将Glossmap存放在纹理的Alpha通道中.Wow中地形纹理_s结尾的为带Glossmap纹理,专门提供给支持PixelShader的机器,低端机器载入不带_s的普通纹理(还是有大量数据冗余,浪费硬盘空间,why?).
地形有凹凸贴图吗?否定,实在太贵.
最烦的就是凹凸贴图,到哪见到的都是它,俗,俗的很.

posted @ 2005-10-30 13:45 linghuye 阅读(810) | 评论 (1)编辑 收藏

仅列出标题
共22页: First 10 11 12 13 14 15 16 17 18 Last