热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RealtimeRendering3rd笔记5

3.4TheVertexShader尽管vertexshader是第一个进行图形处理的阶段,但值得注意的是在这个阶段之前要进行一些数据处理,在Direc

3.4 The Vertex Shader

尽管vertex shader是第一个进行图形处理的阶段,但值得注意的是在这个阶段之前要进行一些数据处理,在DirectX中这被称作input assembler。很多数据流可以被编织在一起形成顶点和图元的集合并向下发送至流水线。例如,一个物体可以用一个位置数组和一个颜色数组表示。“input assembler”可能通过创建具有位置和颜色的顶点来创建这个物体的三角形组。第二个物体可能使用同样的位置数组(连同一个不同的模型变换矩阵)和一个不同的颜色数组来表达。数据表达在12.4.5节中详细讨论。在input assembler中也支持instancing,这个技术允许一个物体使用一些对于每个实例不一样的数据绘制很多次,并且仅仅使用一次draw call。15.4.2中讨论instancing的使用。DirectX10中的input assembler支持使用id标记每个instance,primitive和vertex,并且id可以给之后的任意shader阶段访问。对于早期的shader modles,这种数据只能额外加入到model中。
  一个三角形mesh由一组顶点和描述顶点如何组成每个三角形的信息表达。vertex shader是处理三角形mesh的第一个阶段。对于vertex shader来说,是不知道三角形是如何组成的,正如其名,他专门处理输入的顶点。概括的说,vs提供了一个方法去修改、创建或者忽略每个多边形的顶点所相关的值,例如颜色、法线、纹理坐标和位置。通常,vs将顶点从模型空间变换到齐次剪裁空间;最低限度,一个vs必须总输出这个位置。
vs这个功能最初是2001年被DirectX8所引入的,因为vs是流水线的第一个阶段且使用频繁,他可以在GPU或CPU上实现,如果是CPU实现,就需要将结果转送给GPU去光栅化。这样做就会产生cpu到gpu的速度问题。目前的所有GPU都支持vs。

vertex shader非常类似于之前讨论的通用核心虚拟机(3.2节)。每个顶点被传入到vs程序中处理,vs输出很多个将在三角形或线段上插值的值(早期的shader model也支持输出point sprite particle object的size,但是现在sprite功能是geometry shader的一部分了)。vertex shader既不能创建也不能销毁顶点,并且一个顶点计算的结果不能传递给另一个顶点。每个顶点都是独立对待的,GPU可以对输入的顶点流平行的执行任意数量的vs。

之后的章节将讲解很多vs特效,例如shadow volume创建,vertex blending for animating joints,轮廓渲染(silhouette rendering)。另外一些vs的应用包括:
* 镜头特效(Lens effects):鱼眼效果、水底等歪曲的效果
* Object definition: 仅创建一个mesh一次,然后让他被vs变形
* Object 扭曲(twist)、弯曲(bend)、溶解(taper)操作。
* 程序控制的变形,例如旗帜,布料或水的运动。
* 图元创建:通过向流水线发送退化的mesh。这个功能在新GPU中已经被geometry shader代替。
* 卷页(page curls), 热模糊(heat haze), 水波纹(water ripples)和其他特效可以使用将整个frame buffer的内容作为一个屏幕对齐的mesh的纹理来达到,这个mesh使用程序来变形。
* Vertex texture fetch(SM3.0之上支持)可用来向顶点mesh附加纹理,允许廉价的实现海面和地形高地。

vs的输出可以有很多种不同的消费方法。通常的路径是对于每个被生成和光栅化的三角形,产生的独立的像素片段,发送到pixel shader程序中继续处理。在SM4.0中,数据也可以被发送到geometry shader中,流输出或者两者都有


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 在 Swift 编程中,遇到错误提示“一元运算符 '!' 不能应用于 '()' 类型的操作数”,通常是因为尝试对没有返回值的方法或函数应用逻辑非运算符。本文将详细解释该错误的原因,并提供解决方案。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
author-avatar
unforgettable602
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有