`
izuoyan
  • 浏览: 9223429 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

怎样使用深度纹理

F# 
阅读更多

这个问题经常出现, 所以我试着来总结一下ATinVidia芯片对于深度纹理的支持情况. 如果发现我说错了nVidia的深度实现, 请告知我 :)

ATinVidia在硬件上都支持深度纹理, 虽然方法不一样. 深度纹理的创建非常相似:

* 曝光的格式
- ATi
曝光了两个FOURCC 来创建1624位深度的纹理:

DF16
R300或以上的芯片(9500+)上支持而DF24 只有RV530 和以上的芯片(X1600X1900)才支持.
- nVidia
使用预定义的D3DFMT_D16 D3DFMT_D24S8 格式.GeForce3 和之后的芯片都支持这个.

大多数情况下16位的格式应该满足多数需要了. 只要你适当地选择投影矩阵(近裁剪面尽量大)并且Z的范围适当, 它的精度是足够的. 强烈建议尽可能选择16位的Shadow map, 因为它具有更好的性能, 而且被广泛支持.

* 要检测这些格式的有效性, 可使用CheckDeviceFormat() API.
-
因此, 对于ATi16位深度纹理需要调用
:

-
对于
nVidia:

注意, 检查nVidia的设备ID比上面的做法更安全, 因为nVidia的深度纹理是重载的现有格式(一个关键的不同就是对nVidia的深度纹理进行采样返回的不是真正意义上的深度值).

* 纹理表面(surface)创建
同样的, ATinVidia的调用只有一点不同:
-
对于
ATI:

-
对于
nVidia:

* 中间的设置(surface绑定, viewport, 等等) 两者都是一样的.

* 当渲染完成后深度纹理可以当作是一张普通纹理通过SetTexture() 来使用.

* ATinVidia的深度纹理实现的主要不同是在shader的使用上.
-
ATi深度纹理进行采样会返回深度值. 这需要shader取出深度并与输入的Z值进行比较. 这样允许更为灵活的为每个采样选择滤波掩模(kernel)和权重. X1600X1900支持一项叫做Fetch4的特性, 它会在每次纹理指令执行时返回四个邻近的深度采样到目标RGBA通道. 这就使高性能的shadow map和更大的掩模成为可能
.
-
nVidia的深度纹理进行采样会返回PCF(Percentage-Closer-Filtered)的结果, 并且在采样的同时会自动与输入的Z值做比较.

自动迎合ATinVidia版本的深度纹理创建应该是很简单的, 因为它们在代码上非常相似. 大部分的工作在于HLSL shader代码中的#ifdef来区分ATinVidia风格的逐像素阴影贡献计算. 双方的开发网站上都有相应的代码和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 Technologies
MrT@ati.com

分享到:
评论

相关推荐

    基于二维纹理重建三维人脸深度图像后的人脸识别.pdf

    本文研究了基于二维纹理重建三维人脸深度图像后的人脸识别方法,该方法通过自编码网络将二维纹理映射重建为三维深度图,然后利用卷积神经网络将二维人脸纹理图像映射的三维深度图与已有人脸库中的三维模型生成的深度...

    Unity3D基于深度和法线纹理的边缘检测方法

    本文将深入探讨如何利用深度纹理(Depth Texture)和法线纹理(Normal Texture)来实现边缘检测,从而创建出引人注目的视觉效果。 首先,深度纹理是一种特殊的纹理,它存储了场景中每个像素到相机的距离信息,通常...

    纹理合成论文报告

    - **Gatys的工作**:首次使用深度学习进行基于实例的纹理合成,随后的方法进一步扩展了基于语法的纹理合成。 - **Liand和Wand提出的MGANS**:通过鉴别器训练来捕捉马尔科夫神经斑块的统计数据,但仍有不足之处。 ...

    基于C++实现的三维点云的深度投影和纹理投影源码.zip

    基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于C++实现的三维点云的深度投影和纹理投影源码.zip基于...

    使用几何纹理映射快速地形渲染(英文)

    在渲染阶段,GPU使用这些纹理坐标进行插值,以确定每个像素的颜色和深度,这在渲染大面积地形时特别有效,因为它减少了计算量。此外,通过使用LOD(Level of Detail)技术,我们可以根据观察者与地形的距离动态调整...

    Brodatz纹理图像库以及人工合成纹理图

    在处理Brodatz纹理库时,常见的技术包括特征提取(如局部二值模式LBP、Gabor滤波器、小波变换)、机器学习算法(支持向量机SVM、随机森林、深度学习网络)以及图像处理方法(边缘检测、阈值分割等)。这些工具和...

    Python-学习使用GAN合成3D纹理对象

    在本教程中,我们将深入探讨如何使用Python进行深度学习,特别是通过 Generative Adversarial Networks (GANs) 来合成3D纹理对象。GANs 是一种强大的机器学习模型,由两个神经网络——生成器(Generator)和判别器...

    纹理分割_纹理分割_图像分割_

    4. 机器学习和深度学习:随着数据集的扩大和计算能力的提升,基于机器学习的纹理分割方法,如支持向量机(SVM)、随机森林和深度学习(如卷积神经网络CNN)变得越来越流行。这些方法可以从大量训练样本中学习纹理...

    使用纹理特征简化网格算法(简化效果非常好)

    "使用纹理特征简化网格算法"是国外大学的一项研究,它着重于在简化过程中保护模型的纹理边界,以实现更好的简化效果。 纹理边界是3D模型中的一个重要元素,它们通常对应于物体表面的明显特征,如接缝、图案边缘或...

    基于深度纹理的复杂透明对象稳定绘制类

    在OSG下开发的一个派生自geode的类的源代码,设计了一项基于深度纹理的技术,支持透明物体的稳定绘制,即相当于进行了自定义的消隐,只绘制最前面的片元,避免了显示的混乱甚至出现绘制错误感的情况。类使用简单,...

    OpenGL纹理技术教程

    OpenGL纹理技术允许我们将这些纹理映射到3D模型的表面上,增加视觉效果的真实感和深度。 教程中可能会涵盖以下几个主要知识点: 1. **纹理坐标**:每个3D模型的顶点都会有一个对应的纹理坐标,用于确定纹理应该...

    Kylberg 纹理数据集

    1. **纹理分类**: 数据集可用于训练和评估深度学习模型,如卷积神经网络(CNN),进行纹理图像的自动分类。 2. **特征提取**: 研究人员可以利用该数据集来比较和改进不同的特征提取技术,如局部二值模式(LBP)、...

    opengl纹理映射(下)

    驻留纹理的工作机制是,当创建纹理对象时,纹理数据从内存调入显存,当开始使用纹理时,系统会隐式地将纹理调入显存。但因为显存空间有限,不是所有的纹理都能被驻留,这时就需要纹理代理技术来查询纹理是否能够被...

    彩色纹理图像库

    2. **图像分类**:使用机器学习或深度学习算法,如支持向量机(SVM)、随机森林、卷积神经网络(CNN)等,对纹理图像进行分类。 3. **图像识别**:结合纹理、形状、颜色等多种特征,进行物体识别或者场景理解。 4....

    Python-实现使用GAN进行纹理合成的代码

    在本文中,我们将深入探讨如何使用生成对抗网络(GANs)在Python中实现纹理合成。GANs是一种深度学习模型,由Ian Goodfellow等人在2014年提出,主要用于生成逼真的图像。它们通过训练两个神经网络——生成器...

    opengl纹理贴图例子

    此外,为了看到纹理效果,我们需要开启OpenGL的深度测试,以确保正确的前后覆盖关系。 总的来说,"opengl纹理贴图例子"是一个很好的学习资源,它涵盖了纹理映射的基本概念,包括纹理对象的创建、纹理数据的加载以及...

Global site tag (gtag.js) - Google Analytics