回到20世纪90年代,PC上进入3D图形硬件光栅化时代。VOODOO取代了CPU 光栅化渲染。随后出现NVIDIA TNT。直到GEFORCE将3DFX吞并。现在GPU的演变已经8年,基于屏幕上每个象素的复杂计算已经可以让老shader程序员忽略C和HLSL的区别。
在下一代mmo 3d引擎工具平台开发之前,有必要重新回到GPU内部,关注几何与光栅管道。越来越复杂的shader效果一切均基于光栅器的运作机理。把工作从GPU搬回CPU目的为使图形开发人员打捞图形学基础,在次世代开发中更好的运用GPU功能。
softcore 是一个软件光栅器。用于从场景物体的geometry transform, clipping,lighting, texture mapping, gouraud shading,到最后光栅化显示的整个图形处理管道技术演示。此项目为了保持代码清晰,省略了所有优化。只在可以使用SIMD和MULTITHREAD的步骤做出了标记。为了便于学习,project整合了id software doom3 sdk中SIMD和数学库代码。
由于是两个星期业余时间制作,时间有限,主要目的在于演示3D加速核心算法,光栅化部分的tc,color数值计算和sampler部分仍然需要进一步tunning。需要去除溢出和浮点转整数规则调整。这些可由感兴趣人员自行修改。
softcore project
done:
* CPU soft rasterization
* Z-buffer
* Gouraud Shading
* Perspective Correct Texturemapping
* Near plane Clipping
* Back face culling(geometry)
* Directional lighting
not do:
x Phong shading/bump mapping
x Bilinear filter
x Mipmap
x Dynamic lightmap
x Vertex color export/import
x Optimization
以下是3DSMAX中场景原图。有了硬件BILINEAR效果还是不一样.....
多数初学者往往陷入3DAPI细节。认为绘制带有各种效果的三角形就是在做引擎。或者疲于把各种NVSDK或者D3DSDK的samplecode加入自己的工程。当然,用orge3d这样的开源渲染器也可以做出《天龙八部》,《巨人》等商业产品,不过,想快速开发符合要求的次世代渲染器,需要大量实际工程方面的工作。针对范围很狭窄的渲染器而言,对渲染效果质量的调整,以及自行开发美术需要的效果,不是照抄fxcomposer或者rendermonkey那么简单。由于对GPU工作原理认识不深,对某些效果优化实现背后的理论基础认识不深,都会直接带来在实际工程中开发的障碍。或者导致质量下降。<?XML:NAMESPACE PREFIX = O />
按说做为图形程序员应该对3D光栅渲染的整条流水线做到倒背如流。不过3D硬件厂商加速了应用的进程。使得在屏幕上绘制三角形这件工作变得容易。也许会忽略人们对实时三维渲染的系统知识体系建立。在高级图形渲染逐渐进入更复杂光照,全局光,基于物理或模拟基于物理的技术层面之后,不对GPU工作机理做到透彻了解,在工作中会举步为艰。因为所有渲染工作逐渐移到GPU寄存器中用可编程代码进行。整条管道,从Geometrytransform,clipping,vertexlighting,到pixel的shading都由程序员控制。但GPU仍然自动进行了screen space的一些工作。包括clipping,扫描线线性插值,texture sampler等。这是光栅器能够数百倍快于raytracing渲染的本质。但如果图形程序员不了解被GPU自动进行的工作,也会象C++程序员不了解缺省构造函数一样盲目。
举例,众所周知普通的shadowmap完全不具备工程实用性。最重要的是因为出于内存限制,shadowmaptexture尺寸不可能满足实际渲染精度需要。并且收到三角形在cameraspace中斜率影响巨大。DepthBias问题的本质是什么。与何参数相关。目前采用的各种调节depthmap渲染精度的方法背后理论依据是什么。Perspectiveshadowmap,lightspaceshadowmap等各自优化方法会遇到什么问题,各自优缺点,以及工程中如何tunning,尤其用于self-shadow的问题。基于PCF(percentagecloserfilter)的各种软阴影算法的应用。
在对bumpmap技术改进过程中,在tangentspace使用ray-tracing的reliefmap以及relaxedconesteppingreliefmap,以及带有凹凸轮廓的releifmap技术。以及parallaxmap,和其变种dynamicparallaxocclusionmap。如何在pixel级别用bilineargouraud和这些象素级别lighting进行LOD,如何改进parallaxmap随视角变化而产生纹理浮动的问题,如何调整线性迭代和2分查找对效率和效果的影响。甚至从本质上了解tangentspace,phongshading,都要从软件光栅机理开始。