平民程序 - linghuye's blog

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

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

Geometry Instance

DirectX9.0C直接支持Geometry Instance,通过D3DDECLUSAGE_TEXCOORD多层纹理坐标流,将Instance Data数据传送到GPU,技巧在于:
pd3dDevice->SetStreamSourceFreq(0, (D3DSTREAMSOURCE_INDEXEDDATA | g_numInstancesToDraw));
pd3dDevice->SetStreamSource(0, g_VB_Geometry, 0, D3DXGetDeclVertexSize(g_VBDecl_Geometry, 0));

pd3dDevice->SetStreamSourceFreq(1, (D3DSTREAMSOURCE_INSTANCEDATA | 1));
pd3dDevice->SetStreamSource(1, g_VB_InstanceData, 0, D3DXGetDeclVertexSize( g_VBDecl_InstanceData, 1));

Stream1中的顶点数据,每g_numInstancesToDraw个顶点处理后递进一个,相当于每Instance递进一次.在HLSL中将Stream1中的数据流还原出来.

OpenGL当前不直接支持Geometry Instance,但是注意到
1.OpenGL的glDrawElements簇函数的消耗比DX的DrawIndexedPrimitives小得多.
2.OpenGL有一项DirectX所没有的能力,设置当前全局顶点数据,如glColor3f,glTexCoord,glMultiTexCoord,而且此类函数的单个调用在Driver和hardware上的消耗都极小,所以可以用glMultiTexCoord传递顶点数据到shader,而不是使用glUniformMatrix4fvARB或glLoadMatrix传递变换矩阵,此类设置GPU寄存器的函数,或者说是改变Vertex shader当前的全局处理状态的函数,很显然将等待当前GPU正在执行的Vertex process完成后才能返回,CPU将等待GPU.


The technique does not scale well to complex mesh rendering techniques like skinning; there
are not enough vertex attributes to store all of the bone transforms for each instance.
但,无论Directx9.0c或OpenGL2.1都无法传递几十个骨骼矩阵这么庞大的顶点数据单位格式(注意是一个顶点数据单位格式,OpenGL没有那么多层的glMultiTexCoord, DirectX没有那么大的顶点声明能容纳几十个矩阵),所以都无法完成带骨骼动画的Geometry Instance,只能是静态物体,或使用CPU作骨骼计算. DX10好像可以,没有显卡,没实践过.

CPU和GPU是并行结构,若使得两者完全并行运行,效率将最大化.若一方为了线性逻辑而不得不去等待另一方,效率将降低,这就好像两个线程间需要同步的数据或逻辑越多,效率就越低下.

Reference:
http://developer.download.nvidia.com/SDK/9.5/Samples/DEMOS/Direct3D9/src/HLSL_Instancing/docs/HLSL_Instancing.pdf
http://developer.download.nvidia.com/SDK/9.5/Samples/DEMOS/OpenGL/src/glsl_pseudo_instancing/docs/glsl_pseudo_instancing.pdf

posted @ 2008-03-17 21:11 linghuye 阅读(3648) | 评论 (2)编辑 收藏

Google sucks

I have used my gmail account for more than two years, and yesterday the stupid google programs disabled my account for the reason they even dont know. And there is no place to appeal it, the account help page is just useless. Google is evil.

posted @ 2008-03-16 10:54 linghuye 阅读(942) | 评论 (1)编辑 收藏

多人骨骼动画测试用例及多线程显卡驱动程序下的优化问题

测试1. 渲染1008个Wow的Cat动画模型,每个Cat有346个面,28根骨骼,只需1次Batch.
                            

OpenGL DirectX
P4 2.8G Geforce7950GT 36 30
Core2 1.8G ATI1650XT 33 40
AMD64 1.8G Geforce6150 19 11


测试2  渲染175个Wow的Orc动画模型,每个Orc有1260个面,53根骨骼,需要分10次Batch,但使用同一个顶点Buffer,顶点数 2728 , 面数分别为 726, 22, 8, 66, 16, 13, 116, 34, 114, 142. 兽人模型体现了真实的游戏需求, Cat模型过于理想化.
 

OpenGL DirectX

P4 2.8G Geforce7950GT

27 30
Core2 1.8G ATI650XT 36 56
AMD64 1.8G Geforce6150 23 16.5

/**********************************************************************************************
1.HLSL下1008个cat的例子,使用float3x4 M*V比float4x3 V * M 慢2帧.
2.矩阵从4x4改为4x3后,帧率只提高了1帧,可能GPU不是瓶颈,传送4x4和传送4x3矩阵到寄存器效率相差不多.
3.OpenGL的实现在7950GT下目前有严重问题,竟然比DX低了8-10帧,WHY! 在N卡上OpenGL实现绝对要比DirectX快, 查SwapBuffers不明消耗15ms,未决! TNND,原来是Fraps对OpenGL测帧不准,反而拖慢了SwapBuffers,实际测试后OpenGL比DirectX高出6,7帧,这才正常.
4.ATI显卡对OpenGL支持得差是出名的, 在ATI显卡上DirectX比OpenGL快很正常,OpenGL主要慢在Shader计算上,而且其GLSL的代码和HLSL一模一样, M$和ATI有黑幕.
5.对兽人渲染排序材质后,DirectX提高2帧,OpenGL不变.
6.使用GPUPerfStudio在ATI 1650下做测试,发现OpenGL实现时呈现GPU瓶颈,而DirectX实现时呈现CPU瓶颈. 两者的逻辑层实现是统一的,OpenGL的GPU瓶颈在Vertex processing上,但是简化Skin Vertex Shader处理后未见效率提升,似乎瓶颈不是在Vertex shader上.这样只可能在顶点数量上,但顶点数仅有308,且DirectX模式一样的顶点却高出10帧,OpenGL下Vertex cache有问题,或者每次渲染都传送更新了顶点流?VBO有问题?未决!
7.优化了数次后,没有达到预期目标,感觉相当沮丧.
**********************************************************************************************/

http://linghuye.googlepages.com/RenderCraftPerf.7z

References:
http://developer.nvidia.com/object/multi-thread-gdc-2006.html
http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=235486#Post235486
http://ati.amd.com/developer/gdc/PerformanceTuning.pdf

posted @ 2008-03-11 22:04 linghuye 阅读(2022) | 评论 (2)编辑 收藏

Displacement Map Demo

Displace map demo, OpenGL和DirectX实现, 基于Vertex texture fetch.

1.Displacement Map用到的主要技巧是Vertex Texture Fetch.
2.ATI不支持Vertex Texture Fetch,所以只能用NVidia显卡跑此Demo.
3.Vertex Texture Fetch确实很慢,至少目前不适用.

http://www.cnitblog.com/Files/linghuye/DisplaceMapDemo.rar

posted @ 2008-03-05 19:59 linghuye 阅读(2075) | 评论 (3)编辑 收藏

HDR Demo

HDR Demo,测试RenderCraft,有OpenGL和DirectX实现.

Ported from the HDR demo in <More OpenGL programming>.

http://linghuye.googlepages.com/HDR.7z

posted @ 2008-02-29 23:31 linghuye 阅读(1324) | 评论 (0)编辑 收藏

我的儿子

宝宝去年出生,现在虎头虎脑,可爱非凡,已经知道怎样用手砸键盘了,真是天才啊.

老婆曾问我喜欢男孩还是女孩,我没想过这问题,自然说都喜欢,也确实没太在意.宝宝出生后,我觉得游戏程序员有个儿子真是好,非常地好,简直完美,以后玩游戏机有伴了,这满脑子的知识有传人了.

我学编程是完完全全的自学,其间心酸坎坷,不足为外人道.男孩没有不喜欢计算机的,宝宝想学编程,有我作老师,那肯定的青出于蓝,一年精通C++,两年精通图形学,三年精通游戏编程,以慰当年之苦.

少年时,我是个学习成绩优秀的好孩子,就玩过两次街机(那地方社会气氛是不好),其余的游戏时间都献给了任天堂的红白机(画面是糙点,但乐趣还是十足的),而后就是电脑游戏,从没正经玩过PS2,XBOX什么的,有了咱宝宝,以后就可以陪他玩了,真是人生一大乐事.

我很是羡慕国外的青年小伙,背个背包满世界旅游,青春当如是浪费之啊. 咱努力多攒点钱,把自己和家人照顾好,让孩子读自己喜欢的书,学自己喜欢的专业,做自己喜欢的事,也像欧美人一样旅游去,充充实实地浪费青春。不用一上幼儿园就给他灌输什么长大找工作的压力,不要像他们的父母年轻轻的一身负担,要工作,要供房,要养老,这才是真正的虚度青春.孩子就是喜欢当哲学家,作流浪汉,咱也支持他,只要求他正直善良,不做恶事。

我十分地厌恶那种,苦口婆心地教育子女要听话,要努力学习,要上重点中学,要考重点大学,这样才能找到好工作,挣更多的钱,才能出人头地,光宗耀祖. 这类家长之百分九十的属于自身无能,或是自己挣不到钱,或是自己不去努力,或是自己不去奋斗,或是自己活得憋屈,反而把生活压力压到孩子身上,让孩子替他们身体力行,完成他们本应该做的事,十足的懦夫,可耻. 好好学习,努力学习总是不错的,但如果其目标是以后找工作挣大钱,那思想就很龌龊了,

父母生儿女本就无所谓的恩,而生下子女抚养他教育他也只是做人的良心和责任. 英语中似乎没有孝顺这种说法,看多了外语片也寻不见孝顺这种思想的影子,滥见的是父母间的I love you之类的言语,我希望我的孩子和我之间能这样,而不要有孝顺这个饱含着中国几千年历史负担的思想.

posted @ 2008-02-24 23:27 linghuye 阅读(1776) | 评论 (10)编辑 收藏

优化!优化!优化!

原则
1.以目前计算机的发展阶段而言, 游戏总是CPU Limited.
2.渲染 Batch, Batch, Batch
3.尽力减少图形API调用次数.
4.Minimize data swithing, such as SetStreamSource and SetIndices. Maximize FVF sharing.

认识:
1.DX API消耗Top5:  SetPixelShaderConstant()   SetPixeShader()     SetVertexShaderConstant()   SetVertexShader()   SetTexture()

经验:
1. 过大过多的纹理造成带宽瓶颈,而顶点数据流量一般不足以产生瓶颈.
2.25k batches/s @ 100% 1GHz CPU, 即在PentiumD 2.8G上,令CPU满负荷运转,要保持30FPS,每帧只能渲染25000 * 2.8 / 30 = 2333个batch.经我测试,这只是在最理想状态下,渲染每个大于1000面的静态物体时的数据. 但若渲染的是小于大约130个面的静态物体,可渲染的batch比这高很多,大约2倍左右甚至更高,此时据文档说是CPU在负责计算顶点. 然后,如果渲染的是生物,按GPU计算骨骼运动的标准,最耗的是CPU骨骼层次矩阵计算和SetVertexShaderConst函数,两者都直接和骨骼数量成正比,即骨骼越多可渲染的batch越少.
3.对MMORPG游戏而言,瓶颈总是在CPU上,总是在骨架动作计算和渲染提交Batch次数上.

25k batches/s @ 100% 1GHz CPU



References:
http://ati.amd.com/developer/gdc/2006/GDC06-Advanced_D3D_Tutorial_Day-Huddy-Optimization.pdf

http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide.pdf
http://developer.nvidia.com/docs/IO/8230/BatchBatchBatch.ppt
http://download.nvidia.com/developer/presentations/GDC_2004/Dx9Optimization.pdf
http://developer.nvidia.com/object/gdc_d3dperf.html

posted @ 2008-02-24 21:03 linghuye 阅读(4885) | 评论 (8)编辑 收藏

VC 2003远程调试步骤备忘

1.解压下面链接的压缩包到调试目标机器,路径不限.
2.将待调试程序环境拷贝到调试目标机器,路径不限.
3.在目标机器运行压缩包中的StartDebug.bat.
4.在程序员机器上的VC IDE中设置: 调试 ->
连接:              选TCPIP方式
远程计算机:  填调试目标机器IP
远程命令:      填待调试程序在调试目标机器上的绝对路径.

http://www.cnitblog.com/Files/linghuye/RemoteDebug.rar

posted @ 2008-02-16 23:40 linghuye 阅读(1529) | 评论 (3)编辑 收藏

Render To Vertex Buffer理解和使用

It simply adds two new targets to which buffer objects can be bound: GL_PIXEL_PACK_BUFFER and GL_PIXEL_UNPACK_BUFFER.  When a buffer object is bound to the GL_PIXEL_PACK_BUFFER target, commands such as glReadPixels pack (write) their data into a buffer object. When a buffer object is bound to the GL_PIXEL_UNPACK_BUFFER target, commands such as glDrawPixels and glTexImage2D unpack (read) their data from a buffer object.

A buffer initially filled with vertex data can be bound to one of the pixel buffer targets and used for pixel operations and vice versa. You would render an image using some shader and read back the data from the color buffer into a PBO using glReadPixels(), and the use this buffer as a source for vertex data.

Reference:
More OpenGL Game Programming

posted @ 2008-02-05 10:42 linghuye 阅读(1623) | 评论 (0)编辑 收藏

Deferred Shader Demo

Deferred Shader测试,OpenGL & DirectX兼容实现,在Geforce6150上仍有问题.

实现注意点:
1.Nvidia的GL_NV_float_buffer扩展,使用GL_FLOAT_RGBA32_NV格式创建浮点纹理,必须配合GL_TEXTURE_RECTANGLE_NV纹理目标,不能使用GL_TEXTURE_2D纹理目标.

2.ATI的GL_ATI_texture_float扩展,使用GL_RGBA_FLOAT32_ATI格式创建浮点纹理,没有上述限制,只需使用一般的GL_TEXTURE_2D目标.

3.幸运的是Nvidia支持ATI的GL_ATI_texture_float扩展,然后发现还有个GL_RGBA32F_ARB == GL_RGBA_FLOAT32_ATI,所以正确的兼容的方案应该使用GL_ARB_texture_float扩展.

4.32浮点纹理不支持纹理过滤,必须将纹理过滤方式设置为GL_NEAREST,否则有可能使用软件模拟运行,速度奇慢无比.

5.起初使用float pack_2half(float2 v)来实现几何数据压缩,以能够存储顶点坐标和法线到FBO的纹理,pack_2half是PK2H指令的cg版本,NVidia的glsl也支持该指令,只是编译有warning,但ATI不支持该指令,编译报错,无法兼容,故转向使用GL_ARB_draw_buffers扩展.

6.GL_ARB_draw_buffers对应的OpenGL shader输出为gl_FragData[]数组,DirectX为COLOR0,COLOR1标识.

7.FBO + float texture,使用32位纹理时,7950GT奇慢无比,改用16位浮点后正常,原因未知.

8.DirectX下使用Float texture render target完成.

9.DirectX实现下,7950GT的显卡最新驱动169.21竟然不支持Float texture render target,CheckDeviceFormat失败,晕倒.

10.Geforce 6150下OpenGL模式跑的很慢,DirectX模式CheckDeviceFormat成功,但有问题.

http://www.cnitblog.com/Files/linghuye/DeferShaderDemo.rar

posted @ 2008-02-03 22:37 linghuye 阅读(1434) | 评论 (0)编辑 收藏

仅列出标题
共23页: 1 2 3 4 5 6 7 8 9 Last