随笔分类 - D3D
摘要:延迟着色是一种对3d场景进行后期照明的技术,这种技术突破了以往渲染系统支持多重动态光源时,效率以及各种性能急剧下降的的限制。从而使得一个3d场景可以支持成百上千个动态光源的效果。 它的技术思路主要将3d场景的几何光照信息(位置、法线、材质信息)渲染到render target上,把它们从世界的三维空间转变成屏幕的颜色空间,作为光照计算时的输入,接着,对每一个光源,使用这些信息输入来进行计算生成一帧,然后把这样的一帧(render target)合成到结果的帧缓存上,这样当遍历完所有的光源,计算就完毕了,帧缓存上的图像就是最后的渲染结果。概述:延迟着色的优势1.它能让你在绘制几何图形的时候不需要
阅读全文
摘要:Bloom必须使用Pixel Shader,这相当于一个图像处理的过程大致步骤如下:先对图片(或是渲染结果)做一个Brighter Pass,检测每个像素的亮度值,若大于指定的却值就保留其颜色,反之将其置为黑色输出,这一步是为了仅对高亮的部分产生光晕效果2.对上一步的结果做高斯模糊,或其他种类的模糊,具体根据需要而定,最简单的就是对四周临近4个像素采样求平均值3.将模糊后的图片叠加到原始图片上,即颜色相加具体代码可参考dxsdk中的Post Processing,其中就有Bloom效果,它和边缘检测联用还可以作出诸如边缘光晕这类的特效
阅读全文
摘要:bloom, Fake HDR, True HDR概念HDR在我旧网上有说过原理,主要是参考了gamedev上的文章.现在把这几个放一起解释一下.这些后期处理技术都是为了实现发光特效(glow effect)HDR, 指高动态光范围,类似于暴光的效果,由于rgb分量在计算机显示时超出255范围的就被丢弃,所以暴光效果表示不太出来,于是使用了一些方法来得到这样的效果, 一般常用方法就是把高光找出来模糊后加色混合原场景.bloom 和 Fake HDR(伪HDR), True HDR(真HDR)原理都差不多,主要是在实现方法上的不同, 如下所示实现方法:1. bloom的实现: 只渲染发出的光芒到
阅读全文
摘要:如有转载请注明出处:http://blog.csdn.net/tianhai110/ 在3D游戏开发中,通常需要将文本变成纹理,以便于3D显示。本文阐述了如何通过GDI来生成D3D纹理的方法。 由于汉字多达5000字以上,为每个汉字制作相应图片,显然是不现实的;并且不能够改变字体。 最容易想到的当然是WIN32的GDI绘字,这是最简单,最常用的方法,并且可以改变字体、大小、样式。但缺点也是显而易见的,如果每帧都不断切换GDI,性能将大打折扣。其实,D3D的 ID3DXFONT也是利用GDI来绘字,在direct3d 9.0以前的这个是相当慢的,dx9.0后,微软对其进行了大改,性能有了质的飞跃
阅读全文
摘要:转载请注明出处:http://blog.csdn.net/tianhai110非真实感绘制(Non-photorealistic rendering)(NPR)是计算机图形学的一类,主要模拟艺术式的绘制风格,也用于发展新绘制风格。和传统的追求真实感的计算机图形学不同,NPR受到油画,素描,技术图纸,和动画卡通的影响。NPR已经以"卡通造影"的形式出现在电影和电子游戏中,它也已出现在设计图纸和试验动画中(一)卡通渲染卡通渲染是一种特殊的非真实感绘制技术,它要求帖图由不明显的渐变色块夹杂一些不复杂的纹理组成。它强调粗细线条和简单色块,忽略细节。利用这些很简单很纯粹的线条和色块,
阅读全文
摘要:学习D3D,应该对这三个内存理解,网上收集了一下相关资料,收藏下来。三种内存AGP内存(非本地显存),显存(本地内存),系统内存,其中我们都知道系统内存就是咱那内存条,那这AGP内存是个啥玩意啊?其实是因为在以前显卡内存都很小,那时还是在显存是16M,32M为主流的时候,如果你运行一个需要很多纹理的3D程序,那么显存一会就不够用了,那该咋办呢?只好问系统内存借点用用了!这就是AGP内存的由来,在我们电脑BIOS中有个设置AGP Aperture的选项,这里就是设置显卡可以使用系统内存的最大允许值,通常是设置为64M。注意,这里只是说最大允许值,并不是一开机他就把这64M给拿走了,你的256内存
阅读全文
摘要:关于DDS文件格式的说明作者:Chinafish http://www.csinx.org/IBlog/trackback.asp?tbID=8&action=addtb&tbKey=c851389d61912cf4adee43dca993b1f2b09a33e5DDS文件格式要追述到S3(Silicon & Software Systems)公司提出的一种纹理压缩格式S3TC(S3 Texture Compression), 其目的是通过对纹理的压缩, 以达到节约系统带宽并提高效能的目的. S3TC就是通过压缩方式, 利用有限的纹理缓存空间来存储更多的纹理, 因为它支
阅读全文
摘要:1.镜头不对: 物体不在镜头范围内,检查视图矩阵,世界矩阵,投影矩阵.2.颜色全黑: 打开光照情况下,MATERIAL全为0, 或,在没有打开光照情况下,颜色值为0,造成全黑.检查当前Material和顶点颜色和纹理颜色.3.深度不对: 被已有的深度遮住了.检查当前深度,直接在此渲染前加Clear深度为1.0作测试.4.CullMode设置不对: 所有三角形被当作背面剔除了,设为CULL_NONE测试. 5.3D物件的纹理坐标统统大于1.0,且此时纹理寻址方式为BORDER, 且BORDER被设为黑色,画面全黑.6.深度被Clear为0.0,且打开深度测试,绝对什么都画不上,上述3的特例.7.
阅读全文
摘要:低级编程错误的根由是粗心造成的,而这里所谓高级编程错误源自各版本驱动程序的Bug和一些不合理的API接口,此类错误通常令人吐血,出现一个都要耗费数小时甚至数天来解决,这是个实际经验累计的过程,痛苦而又必要.1.要求D3DXCreateTexture创建D3DFMT_A8R8G8B8格式纹理,在某些显卡(MX4000,Intel82815,FX5200)的某些驱动程序环境下,会意外地返回D3DFMT_A4R4G4B4,导致程序写内存错误,系统崩溃,蓝屏报告显卡驱动程序DLL错误,文字呈现白色方块等一系列错误现象.切记,不能相信D3DXCreateTexture.2.表象上,单句g_D3DDevi
阅读全文
摘要:原则1.以目前计算机的发展阶段而言, 游戏总是CPU Limited.2.渲染 Batch, Batch, Batch3.尽力减少图形API调用次数.4.Minimize data swithing, such as SetStreamSource and SetIndices. Maximize FVF sharing. 认识:1.DX API消耗Top5: SetPixelShaderConstant()SetPixeShader()SetVertexShaderConstant()SetVertexShader()SetTexture()经验:1. 过大过多的纹理造成带宽瓶颈,而顶点数据
阅读全文
摘要:另外给出一份dx sdk中关于常用dx api的performace性能参数,在文档中也有明确说明,这些api的调用开销会根据实际情况有不同。 API Call Average number of Cycles SetVertexDeclaration 6500 - 11250 SetFVF 6400 - 11200 SetVertexShader 3000 - 12100 SetPixelShader 6300 - 7000 SPECULARENABLE 1900 - 11200 SetRenderTarget 6000 - 6250 SetPixelShaderConstant (1 Co
阅读全文
摘要:1.树叶/动物嘴上的牙齿,胡须/身上的鬃毛,形状曲折复杂,若直接用三角形带构建会大大增加物体的三角形数,所以应使用少量的三角形加Alpha纹理来实现.过滤了Alpha的纹理可以描绘出曲折的形状边缘.2.怪物眼睛发光,那是用了额外附着的不透明的纹理三角片,很可能还是billboard.3.该GL_CULL_FACE的地方应该Cull Face,以提升效率.4.BLEND_MODULATE_2X使盔甲呈现高亮, BLEND_ADDITIVE_ALPHA增加加物体细节.5.WoW的登录界面就是个m2 + xml + lua,一个模型搞定一个界面. 6.在3D空间中画一个中间镂空的平面边形(由三角形M
阅读全文
摘要:在使用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.
阅读全文
摘要:RTT是现在很多特效里面都会用到的一项很基本的技术,实现起来很简单,也很重要。但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿,不知道是因为太简单还是因为这项技术已经出现很长时间了。总之我是在摸索这个东西的时候绕了不少弯子。现在把具体的实现方法写下来。渲染到纹理,顾名思义就是把渲染目标从帧缓存变成一个纹理。这样就可以把一个场景渲染后在进行Post Process,做出现在流行的各种特效。另外在利用GPU做通用计算的时候程序也是通过RTT和GPU交换数据的。实现步骤:声明变量LPDIRECT3DTEXTURE9 pRenderTexture = NULL; // 目标纹理LPDIRECT
阅读全文
摘要:在场景中被灯光照射的地方会产生阴影,这将使场景变的更真实。在这一部分我们将演示怎样实现平面阴影,即在平面上的阴影(如图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
阅读全文
摘要:运动模糊是景物图象中的移动效果。它比较明显地出现在长时间暴光或场景内的物体快速移动的情形里。为什么会出现运动模糊 摄影机的工作原理是在很短的时间里把场景在胶片上暴光。场景中的光线投射在胶片上,引起化学反应,最终产生图片。这就是暴光。如果在暴光的过程中,场景发生变化,则就会产生模糊的画面。 Why should you bother? 不难发现,在电影或电视中,运动模糊是经常出现的,甚至于你不会注意到它。另一方面,在计算机图形中,你就会发现缺少运动模糊,由此也带来了失真。 举个例子,lensflare是近来较为流行的一种图象效果,但传统的图象制作者常常简化此效果,自从我们认识到它是仿真的一种工.
阅读全文
摘要:动态模糊近几年广泛应用于游戏制作的一种特效,可以使得游戏所呈现出的运动画面更接近于真实相机所拍摄出的效果。 在真实世界中,运动模糊是指在相机拍摄画面时,由于被拍摄物体在相机快门曝光的短暂时间内有一定幅度的运动,造成拍摄出的画面产生残影和模糊的效果,通常相机只有在捕捉高速运动物体或者相机本身处在高速旋转中会出现这种效果。 那么如何能利用GPU在游戏画面中实现这一效果的呢? 其实原理和实现都非常的简单,实现Motion blur的方法也有很多,这里以DirectX9自带Sample中的方法为例进行说明。 我们知道在游戏中对于画面的渲染是一种单帧渲染,通常情况下,两帧之间并没有直接关联,但是对于动.
阅读全文
摘要:1.什么是体积雾? 这个问题通过图片来解答再合适不过了,下面是本文利用体积雾做的一个结果 所谓体积雾:顾名思义就是被限制了形状的雾,本文表述如何通过ImageProcess(图象处理)的方式实现体积雾。 2.常规雾原理 雾效最终体现在雾颜色与场景色的混合上。决定雾的浓度的关键就在这个混合因子上。下面我们给出公式.float4 finalColor = factor * fogColor + ( 1 - factor) * sceneColor; ( !提取公因式,减少计算量)=factor( fogColor - sceneColor) + sceneColor; ( factor>=0
阅读全文