求教,关于Direct3D programming的一个问题。想要access zbuffer, 看MSDN, zbuffer format似乎只能用Format.D16Lockable(in C#), 可是我还想要用stencil buffer,于是只好把format设置成Format.D24S8.而且Format.D16Lockable并不为很多硬件支持。
要access zbuffer,是因为需要一个function,给定屏幕上任一点,要知道这个pixel在3D world里的坐标。
用stencil buffer,是为了产生一种类似于影子的效果。
vertex shader+pixel shader,或许可以?可是我现在对这两个东西一点儿都不了解。有人可以指点一二吗?[zzjbug (1-11 17:51, Long long ago)]
[ 传统版 |
sForum ][登录后回复]1楼
用Format.D24S8 不好吗?if you want to dabble with HLSL, you can try the simplest case of using shadow mapping
1. write a vertex shader that computes the depth value of each pixel from the light's point of view and store the result in a shadow map
2. write a pixel shader that uses that shadow map
based on what you described, you should know in theory how it works. the HLSL implementation is merely implmentation and should be described from some online tutorials.[SmellsLikeTeenSpirit (1-11 20:01, Long long ago)]
[ 传统版 |
sForum ][登录后回复]2楼
(引用 SmellsLikeTeenSpirit:用Format.D24S8 不好吗?if you want to dabble with HLSL, you can try the simplest case of using shadow mapping
1. write a vertex ...)你说的是"Shadow Z-buffer" algorithm吗?用Format.D24S8,已经可以做成影子效果了,我用的是Shadow Volume,觉得这个比较简单,而且比较适合我的情况。(并不是真的影子,而是类似于影子)。
问题是我想知道任何一个Pixel的三维坐标。
用HLSL,我觉得应该是Vertex Shader把depth value传给Pixel Shader(间接的,经过interpolation).可是Pixel Shader怎么告诉我的application呢?看了一些HLSL的资料,还是一头雾水。按照我的理解,Pixel Shader只能往Frame Buffer和Depth Buffer里写数据。那么难道我每次想要求点的坐标时,都要用HLSL重新Render一遍,把depth value写到Frame Buffer里吗?
或许我理解错你的意思了,可以详细解释一下吗?
很感谢帮我。[zzjbug (1-12 18:50, Long long ago)]
[ 传统版 |
sForum ][登录后回复]3楼
(引用 zzjbug:你说的是"Shadow Z-buffer" algorithm吗?用Format.D24S8,已经可以做成影子效果了,我用的是Shadow Volume,觉得这个比较简单,而且比较适...)具体你可以看自带的SDK documentation我还没真正写过HLSL的code[SmellsLikeTeenSpirit (1-13 23:58, Long long ago)] [ 传统版 | sForum ][登录后回复]4楼
take a look at this onehttp://www.gamedev.net/columns/hardcore/softedgeshadow/[SmellsLikeTeenSpirit (1-19 8:04, Long long ago)] [ 传统版 | sForum ][登录后回复]5楼
不懂Direct3D,但OpenGL里可以用gluUnproject做到利用screen coordinate sx, sy, 读depth buffer中(sx,sy)的z值。然后用gluUnproject就可以得到world x,y,z[Sunshine (1-20 12:58, Long long ago)] [ 传统版 | sForum ][登录后回复]6楼