D3D 中的渲染流程问题,望高手指点一下

luoya263547560 2009-11-04 11:25:02
1.首先,我现在知道的渲染流程:
管线的流程
首先是顶点坐标转换:
物体坐标——》世界坐标——》相机坐标系
坐标转换之后进行的是:

光照变换--》投影变换--》视区变换

视区变换之后:

像素处理——》像素测试(模板测试,深度测试,Alpha测试等等)——》渲染像素

在可编程流水线中用:
VS取代了上面的顶点变换,PS取代了上面的像素处理过程。

上面是我现在的认识,很混乱,也很模糊,也可能有很多错误,希望哪位高手能指点一下。希望能给细化和统一一下,比如:纹理是在哪个阶段加入的?像素处理都包含哪些操作?

2.对于D3D里面的一些函数:DrawPrimitive,Present ,都对应到哪些阶段里面,内部都做了些什么样的操作?

3.关于D3D里面的离屏表面:比如可以设置RenderTarget,SetDepthStencilSurface,让D3D将像素渲染到一个非屏幕的面上,这个详细点应该怎么去理解?比如:为什么设置了RenderTarget,还要设置SetDepthStencilSurface,这两个有什么关系?

问题较多,先再这里谢过了。这些问题让我现在感觉很朦胧,很模糊,希望能帮帮忙,帮我解除这些迷惑。
...全文
930 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaozhenkui 2012-04-25
  • 打赏
  • 举报
回复
可以对纹理进行操作,实现离线渲染
xingzhe2001 2009-11-04
  • 打赏
  • 举报
回复
d3d sdk的说法
IDirect3DDevice9::Present
Presents the contents of the next buffer in the sequence of back buffers owned by the device.

可能除了bitblt还有些处理

hdr是用户自己的效果,不是d3d的,不属于哪个阶段。属于一般图形引擎的后期处理阶段,实现的话通过pixel实现

luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
还有一个疑问,想HDR这样的操作,是不是在像素处理的时候才进行的?谢谢
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
图片很强大,需要研究一下,谢谢,行者大哥能不能再帮我解释点问题,关于present你说是交换缓冲的操作,对于这个地方,我是这么想的,它就类似于VC里面的Bitblt的功能,将后台缓冲的像素拿到屏幕上来,我的理解对吗?不对的话,请指教,谢谢
jematrix 2009-11-04
  • 打赏
  • 举报
回复
学习~~
xingzhe2001 2009-11-04
  • 打赏
  • 举报
回复
看我第二个图的下面部分,首先是到rendertarget,然后通过present到达显示器
xingzhe2001 2009-11-04
  • 打赏
  • 举报
回复
xingzhe2001 2009-11-04
  • 打赏
  • 举报
回复
首先如果你看看随便一本计算机图形学的本科教材,对这些阶段是干什么搞明白了就好理解。
我先简单说一下
1. 纹理阶段一般是在Pixel 处理阶段进行的,但是对于Nvidia的硬件,支持vertex texture, 在vertex阶段也可以进行。
像素操作包括 fog, scissor test, alpha test, depth/stencil test/ alpha blend

2.Drawprimitve是渲染管线的开始,告诉gpu开始干活,gpu就开始坐标变换,顶点处理---等等
present相当于个swap buffer工作

3.设置 stencilbuffer是为了防止画rendertarge的时候把当前屏幕的那个stencil/depth buffer给改了。

关于d3d pipeline的详细学习资料,在sdk中搜索 Direct3D Architecture (Direct3D 9)

http://msdn.microsoft.com/en-us/library/ee417844(VS.85).aspx

网上牛人写得pipe line 详解,图片比较大,这里是所略图,打开联接看大图
http://topic.csdn.net/u/20091104/11/9e9fffd9-0662-4dde-b48d-d5375288bc68.html

相信这两个资料能解开你的疑惑,尤其是第二个
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
问题再补充一下:D3D里面的渲染好像是多层的,默认的就是屏幕,自己也可以创建一个非屏幕的层,这个应该没什么错吧,问题就是在创建这个层的时候的详细创建的方法中,为什么要创建RenderTarget还要创建SetDepthStencilSurface呢,还有,这个应该是在渲染流程中的哪个步骤呢?是不是在DrawPrimitive后就把像素绘制到Target上了呢?Present 都做了些什么操作?是不是把后台缓冲里的像素都给绘制到了屏幕上,也就是说D3D里面的后台缓冲的机制是什么样的?和离屏表面有什么关系,可以互换吗?,问题真多,呵呵
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
顶一下,顺便说一下,下面这篇文章我看到了,但是还是不太明白,请不要引用这篇文章解答了:
*.首先Device的使用者要准备好顶点数据,也就是一个顶点的数组,称为A
*.然后这个数组A被传入device的渲染管线
*.device内部依次对每个顶点进行处理,有两种模式,固定管线和shader模式,所谓固定管线就是device内部实现的一个固定的程 序,用户只能通过设定各种参数(一些RenderState)来控制它,当然这不够灵活,所以有了shader模式,也就是说,用户需要写一个程序片段 (所谓vertex shader),传给device,然后device使用这个片段对每个顶点进行处理.这个程序片段是在显卡上执行的.
*.传入的顶点数组A的每一个元素被转换后,存储到另一个数组B中.数组B中的每个元素必须至少包含一个透视空间的位置,用来做裁剪.
*.数组B被传入到device的下一个计算阶段,在这个阶段里,数组B中的(被转换过的)顶点被组织成一个个三角形,然后对这些三角形进行裁 剪(利用顶点数据里包含的那一个透视空间的位置),背面剔除(注意背面剔除和顶点的法线是没关系的),最后剩下的三角形被保存到一个数组C中.(注意在这 个阶段里顶点数组变成了三角形数组)
*.数组C被传入到下一个计算阶段,光栅化,对于数组C中每一个三角形,首先把它们从透视空间映射到屏幕空间,然后找出它们在屏幕上覆盖的像素 (一个三角形覆盖的像素的数量有可能是很多的),对于每一个像素,根据它在三角形中的位置,通过三角形的顶点进行线性插值,计算出一个像素数据(注意像素 数据是通过三角形的顶点数据插值而来,所以它们的数据类型是一致的),所有三角形算出来的像素数据最后被存储到一个数组D中.(在这个阶段里,三角形的数 组变成了像素数据数组)
*.数组D被传入到下一个计算阶段,在这个阶段里,device会对这些像素做一些初步的过滤,主要是进行stencil test(根据stencil
buffer上的值)和z-test(根据这个像素的Z值和z-buffer上的值进行比较),根据测试结果会对stencil buffer进行一些修改(使用一组render state来控制这个过程),通过这些test的像素被存储到数组E.
*.数组E被传入到下一个计算阶段,在这个阶段里,device对每个像素数据进行处理,这个阶段也有两种模式,固定管线和shader模式, 与顶点处理阶段类似,用户也可以写一个程序片段,来对每一个像素数据进行处理,称为pixel shader.像素数据可能包含各种类型的数据,但经过这一阶段的处理后,输出是很简单的,一般就是一个颜色值和一个alpha值(透明度),也可以输出 一个Z值,不过好像不常用.在pixel shader里还可以使用专门的指令来放弃某一个像素的后续处理.所有的像素数据被处理后,结果存在一个数组F中.
*.数组F进入下一个阶段,在这一个阶段里,进行alpha test(根据像素的alpha 值),alpha test是最后一个test了,通过了alpha test的像素可以保证绘制到屏幕上去,通过test的像素会把它们的z值更新到z-buffer中去(具体由一组render state控制),通过test的像素被存入数组G
*.数组G进入下一个阶段,在这个阶段里,主要是把数组G里的像素和屏幕上已有的像素进行混合,具体混合的方式有多种多样,由一系列render state进行控制.混合以后的像素就被"画"到屏幕上了
fenix124 2009-11-04
  • 打赏
  • 举报
回复
谢谢了。怎么才能补分,直接发个贴,啥内容都没有不太好...我现在也在慢慢学习d3d,还会有很多问题,到时候一起补给你。
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
有趣,跑到我的帖子里问问题了,呵呵。没有相应值的话,出错呗,比如没有法线,光照就会出现不准确的效果,恩,大概模型就会是黑色的了。你可以试一下。三角形顶点的颜色是自己赋值的,顶点可以包含颜色信息。关于顶点颜色的信息的确定是下面的规律:
1.不用灯光,材质,和纹理。顶点颜色取自自身所设置的颜色,如果没有设置颜色,就是黑色,其他非定点的像素颜色通过插值得到。
2.使用灯光和材质,但是不用纹理,顶点颜色取决于光照的颜色。其他非定点的像素颜色通过插值得到。

3.使用纹理映射,像素的最后颜色取决于纹理阶段混合状态。具体的就看一下纹理操作吧,操作比较复杂。

关于图元顶点的颜色:其实顶点的颜色的作用就是去确定最终像素的颜色。自身一个顶点有什么颜色意义并不大,最终的像素的颜色才是显示的颜色。

我是这么认为的。

你得补给我分哈。呵呵
fenix124 2009-11-04
  • 打赏
  • 举报
回复
楼上的大哥,你好。我问个问题哈,渲染的过程中需要某些值,但是顶点里面没有这些值,会怎么处理。
比如没有法向量,没有diffuse之类的。插值之前三角形三个顶点颜色是怎么得到的,光照,材质和之类的怎么影响顶点颜色的。thanks in advance.
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
OK,结贴
xingzhe2001 2009-11-04
  • 打赏
  • 举报
回复
《Vertex Transformation(顶点变换) 》

那个是使用sofeware vertex processing 时才可以用的。 在vertex process之后。

参考这篇文章


当primitive在某个边界之外,则这个顶点就会被删除。这个边界可能是render target的边界,也可能是3维空间的任意的面。当一个primitive被删除的时候,边界以内的部分就确定了,就可以渲染这个部分了。剪裁面和模型的相交,可以产生新的顶点。新的顶点就是剪裁面和物体模型几何体相交的点。当线和三角形被剪裁掉,新的顶点产生。面的法线,纹理坐标,diffuse , specular可以通过插值取得。

Direct3D 提供了集中面剪裁的方式,一种是用户自定义的面,一种是通过视截头体。视截头体提供的是一个照相机显示的空间。Guard band剪裁则类时与视截体空间剪裁,但是它在某些设备能提供更好的性能优化。还有一些frame buffer的操作,如Z test, alpha test, stencil test和一些像素shader,也可以被认为是剪裁操作。但是,这些操作的对象是像素,而不是集合体。

用户clip 面
用户自定义的clip面最多提供6个面,每个面有一个组系数定义。它可以用于固定功能流水线和可编程顶点处理。clip面的序号是0到5。 可以通过GetClipPlane和SetClipPlane. RS Clip plane enable 控制是否使用这个clipping.

视截体clipping
如果RS Clipping为真,则视截体clipping被使用。当视截体clipping或者用户定义面被clipping,设备返回clip状态的被剪裁的primitives的信息。当primitive被处理,并且它与剪裁面相交,它将会在clip状态里面设置一个位。如果一个primitive 完全在视截体的外面,它将被culled. Clip status使用GetClipStatus和SetClipStatus管理。这个状态本身是保存在D3DCLIPSTATUS9里面的。

typedef struct _D3DCLIPSTATUS9

{

DWORD ClipUnion;

DWORD ClipIntersection;

} D3DCLIPSTATUS9

Guard Band clipping
它类似与视截体clipping,它是基于像素操作,不是基于模型集合。Guard band是一个覆盖当前视口的区域。任何在当前视口以外但是guard band以内的primitive都会被删除。

如果能保证所有的几何体都在guard band内部,昂贵的几何clipping和插值将会被忽略,如果不能保证,视截体clipping必须要使用。Guard band 的范围 GuardBandLeft, GuardBandRight, GuardBandBotttom,GuardBandTop,它们的值都在屏幕空间。


至于哪个过程最耗时,不同的程序不一样,有的程序瓶颈在vertex处理,有的在pixel处理,你可以用NVIDIA的NvPerf工具察看瓶颈
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
顺便提一下,在整个D3D渲染的流程中,中间的哪个过程是最耗时的呢?
luoya263547560 2009-11-04
  • 打赏
  • 举报
回复
行者大哥,我在图里面看到了一个这样的函数:SetClipStatus 里面提到了视锥体的裁剪,难道D3D可以自己实现视锥体裁剪吗?这个以前一点也没发现过,行者大哥用过这个函数么?能稍微介绍一下么?谢谢,再加20分也成

8,306

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧