这个问题经常出现, 所以我试着来总结一下ATi和nVidia芯片对于深度纹理的支持情况. 如果发现我说错了nVidia的深度实现, 请告知我 :)
ATi和nVidia在硬件上都支持深度纹理, 虽然方法不一样. 深度纹理的创建非常相似:
* 曝光的格式
- ATi曝光了两个FOURCC 来创建16或24位深度的纹理:
DF16在R300或以上的芯片(9500+)上支持而DF24 只有RV530 和以上的芯片(X1600和X1900)才支持.
- nVidia 使用预定义的D3DFMT_D16 和D3DFMT_D24S8 格式.GeForce3 和之后的芯片都支持这个.
大多数情况下16位的格式应该满足多数需要了. 只要你适当地选择投影矩阵(近裁剪面尽量大)并且Z的范围适当, 它的精度是足够的. 强烈建议尽可能选择16位的Shadow map, 因为它具有更好的性能, 而且被广泛支持.
* 要检测这些格式的有效性, 可使用CheckDeviceFormat() API.
- 因此, 对于ATi的16位深度纹理需要调用:
- 对于nVidia:
注意, 检查nVidia的设备ID比上面的做法更安全, 因为nVidia的深度纹理是”重载”的现有格式(一个关键的不同就是对nVidia的深度纹理进行采样返回的不是真正意义上的深度值).
* 纹理表面(surface)创建
同样的, ATi和nVidia的调用只有一点不同:
- 对于ATI:
- 对于nVidia:
* 中间的设置(surface绑定, viewport, 等等) 两者都是一样的.
* 当渲染完成后深度纹理可以当作是一张普通纹理通过SetTexture() 来使用.
* ATi和nVidia的深度纹理实现的主要不同是在shader的使用上.
- 从ATi深度纹理进行采样会返回深度值. 这需要shader取出深度并与输入的Z值进行比较. 这样允许更为灵活的为每个采样选择滤波掩模(kernel)和权重. X1600和X1900支持一项叫做Fetch4的特性, 它会在每次纹理指令执行时返回四个邻近的深度采样到目标RGBA通道. 这就使高性能的shadow map和更大的掩模成为可能.
- 从nVidia的深度纹理进行采样会返回PCF(Percentage-Closer-Filtered)的结果, 并且在采样的同时会自动与输入的Z值做比较.
自动迎合ATi或nVidia版本的深度纹理创建应该是很简单的, 因为它们在代码上非常相似. 大部分的工作在于HLSL shader代码中的#ifdef来区分ATi和nVidia风格的逐像素阴影贡献计算. 双方的开发网站上都有相应的代码和shader示例和文档.
为了确保高性能, 有两条值得注意的事情(基于实际的例子:)):
- 记着在渲染投影物体到深度纹理时关闭颜色写入(color write). 大多数情况下你会对深度纹理的内容感兴趣(运行时需要绑定一个有效的跟深度纹理/纹理大小一致的颜色缓冲(color buffer)). "忘记"关闭颜色写入会引起不必要的颜色缓冲带宽消耗.
- 关于渲染透明(alpha测试)投影物体到深度纹理: 确保只对需要透明的三角形开启了alpha测试 (或者texkill 如果目标surface不能与
D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING一起使用). 为所有投影物体 保持alpha测试开着(或使用一个texkill
shader)会让早期的Z优势失效, 因为pixel shader可能会在深度比较之前执行.
所有阴影渲染也可以使用同一个灵活的shader, 但这需要付出额外的步骤:)
Nick
European Developer Relations, ATI TechnologiesMrT@ati.com
分享到:
相关推荐
针对行人检测算法中存在特征鲁棒性差及分类器拟合非线性数据能力弱等问题,提出一种基于纹理特征和深度学习分类算法的行人检测方法.提出一种改进的GSRLBP纹理特征提取算法,提取行人图像的局部纹理特征,通过获取像素点...
为了降低3D-HEVC编码标准中深度图的帧内预测编码复杂度和编码时间,使用概率统计分析纹理图的最大编码单元(LCU)划分分布与深度映射图的LCU划分分布之间的相关性,提出一种快速算法,通过判断纹理图中LCU的划分深度,跳过...
基于多级纹理特征的深度信念网络人脸识别算法.pdf
基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于...
在OSG下开发的一个派生自geode的类的源代码,设计了一项基于深度纹理的技术,支持透明物体的稳定绘制,即相当于进行了自定义的消隐,只绘制最前面的片元,避免了显示的混乱甚至出现绘制错误感的情况。类使用简单,...
基于二维纹理重建三维人脸深度图像后的人脸识别.pdf
国外大学研究成果,使用纹理边界特征简化网格算法(简化效果非常好),UV's boundary preserved
本资源基于深度和法线纹理实现了边缘检测特效,详见博客→https://zhyan8.blog.csdn.net/article/details/131341229
学习使用GAN合成3D纹理对象
基于纹理分析和深度学习的肝纤维化研究进展.pdf
绘制阴影,需要用到深度纹理,即从光源角度看模型并绘制一张纹理图,纹理图的颜色代表了模型上的点离光源的深度,只有离光源较近的点才会绘制到深度纹理图中,被遮挡的点不会被绘制到深度纹理图中。判断地平面中的点...
How to better achieve non-stationary texture synthesis. Extending an image of a smaller object in nature to obtain a larger image, and retaining the overall structure and texture of the original image...
数据集包含10种不同的背景纹理数据集,数据按照文件夹储存,不需要处理可直接用作深度学习训练数据。 数据分为以下10种不同背景的纹理图案:砂纸、铝箔、发泡胶、海绵、灯芯绒、亚麻、棉、黑面包、橙皮和饼干共10类...
本文采用了基于置信度传播优化的深度估计算法,在估计深度的同时评估置信度,并基于置信度对深度值进行优化,在稀疏化角度采样以及弱纹理场景中可以取得较好的结果。随代码附上的是本课题小组在实验室拍摄的布娃娃...
数据集包含轮胎纹理裂缝图像分类数据集(2分类),数据按照文件夹储存,不需要处理可直接用作深度学习训练数据。 数据分为以下2种轮胎纹理图像:有裂缝、正常纹理轮胎 数据集总大小:717MB 下载解压后的图像目录:...
对象检测可用于定位具有相似空间、光谱和纹理特征的目标。这与以前版本 的 ENVI 深度学习不同,之前版本的深度学习仅在逐个像素的基础上定位特征 (称为像素分割)。虽然该方法仍然可用,但对象检测是此版本的新增...
分析式纹理合成技术及其在深度学习的应用.pdf