Nebula3 Shader系统

本文详细解读了DirectX11中的着色器系统,包括ShaderModel版本演变,N3工具设计思路,以及Shader与渲染整合过程。重点阐述了着色程序的分类,如顶点着色、像素着色和几何着色,并介绍了Tessellation技术。此外,文章还讨论了N3工具中的Shader片段如何通过输入输出参数进行链接,形成完整Shader程序,最终与渲染系统相整合。

Shader Model 已经有五个版本了:分别是Shader Model 1.0(DirectX8.0)、Shader Model 2.0(DirectX9.0b)、Shader Model 3.0(DirectX9.0c)、Shader Model 4.0(DirectX10)、Shader Model 4.1(DirectX10.1)和Shader Model 5.0(DirectX11)。N3的版本是 DirectX 9.0c, 也就没有赶上 GS (Geomtry Shader)。

N3 中涉及这个系统的文件主要是如下:Shader, ShaderInstance, ShaderVariable, ShaderVariableInstance, ShaderServer, ShaderVariation,shadersemantics,ShaderFeature, 这些基本是对ID3DXEffect一个操作封装,如果要理解工作原理,需要先熟悉DX的Shader Model. 同时N3还设计了一个编译系统,用来生成.fx文件,也就是DX的shader代码文件,这些文件通过一组规则,用XML配置产生。

所以本文,打算,分三部分,第一步解析DX的Shader系统,第二步,解析N3的工具,第三步解析N3的Shader以及这个系统与渲染的整合过程。

着色器


着色程序,分为顶点着色和像素着色,到4.0版本出现了 几何着色,但是由于效率问题,在5.0版本出现一个新技术Tesselltion。简单的回顾一下概念,SM 4.0 中的GE这里就不深入了。

vetex着色: 给定顶点,顶点着色接收渲染管线传送过来的顶点,颜色,纹理坐标等数据,结合Shader变量,给出当前顶点的坐标,颜色值

pixel 着色: 给定像素,像素着色接收顶点着色的输出作为输入,综合设置的Shader 变量,给出当前顶点的颜色值 , 这里颜色值

着色变量,可以是各种类型,包括自定义结构体,通常会包括,各种矩阵以及逆矩阵,相机的坐标,采样纹理等数据,

DX 8.0 取消了固定流水线,取代的是一个可编程的流水线管道 : 一个shader,可以是多个 tench,  一个 tench 可以是 多个 pass, 每一个 pass 都有定义的 vetex shader 和 pixel shader 。

N3的着色器


N3的着色器设计主要是: N3的Shader的导出工具 , N3着色与渲染的整合

要理解N3的设计,需要先知道N3中的Shader的导出工具,具体工程是 nsc3:

其中有几个比较重要的概念 Shader , ShaderNode, ShaderSlot

一个Shadr 由 几个 ShaderNode组成,

ShaderNode 代表的是 ShaderFragment,  而一个ShaderFragment,可以包含片段程序,包括 VertexShader 和 PixelShader

而一个ShaderSlot 代表一个输入或者输出的参数,这些参数链接,不同的ShaderNode

这样就构建了Shader的编辑框架,类似U3中的材质编辑器,用线条链接各种Shader片段

先来结构一下这个框架的设计

一个顶点程序 :

vsMain (vsInput , vsOutput)

{

          vsSourceCode;

}

类似上面的伪代码,是由三部分构成,vsInput, vsOut, vsSourceCode, 所以在xml中配置好这三部分就可以生成一个顶点Shader。

一个像素程序:

psMain(psInput, psOutput)

{

     psSourceCode;

}

如上面的伪代码,也是由三部分构成,psInput, psOutput, psSourceCode, 所以在xml中配置好这三部分就可以生成一个像素Shader。

刚刚上面提到的是基本的着色程序片段。

要生成一个可执行的着色程序,需要一个连贯性。

顶点程序,从图形管道获取原始顶点数据,生成变换后的顶点,UV坐标,纹理等顶点相关的数据,供给像素着色程序使用,像素着色程序结合顶点程序的数据以及其他常量,计算像素的最后颜色数据。

所以构建一个Shader : 需要从外部获取数据vsInput,顶点着色生成一个 vsOutPut, 然后像素着色根据 vsOutput (= psInput) , 生成一个 psOutput, 然后显示设备拿这个psOutput的颜色数据放入帧缓冲区。

有了这些基础的信息。

我们接着说N3的事情,

N3把 着色程序,分解到各种片段,对片段的输入输出重定向配置各种Node,然后把各个Node 通过输入和输出Slot链接起来。为了统一执行上述链接过程。

N3引入了五个标准Node: Vertex,  Interpolator, Sampler, Constant, Shared, Result

其中 Vertex 代表的是 从图形设备的数据管道流入的数据,也就是外部输入数据

而 Interpolater 代表的是  顶点着色程序的输出数据,同时也是 像素程序的输入数据

Sampler 代表的 对各种纹理贴图的采样

Constant 代表的是 常量

Shared 代表的共享变量

Result 代表的是 像素程序的输入数据

所以VertexNode 只有输出没有输入, Result 值有输入没有输出, 而 Interpolater 的输入和输出是一致的,如果Interpolater的某一个变量有输出,但是没有输入,也就是没有顶点着色程序生成这个数据,则需要在Vertex中补充一个输出,这样后面的像素着色才可以从Interpolater中获取相应的数据。

图形分解


下面用图形来展示整个过程:

Image(1)

上图展示的整个着色过程。 其中我们先分解成两部分,顶点着色和像素着色:

Image(2)

我们接着细分 顶点着色程序:

Image(3)

和前面的分解是一样的,把整个处理过程分解成三部分 输入参数,着色代码,输出参数。顶点着色的输出参数和像素的输入参数是一致的(除了哪些来自外部的常量)

细分 像素着色程序:

Image(4)

通过前面的图示,我们已经完美的分解了整个着色程序。把着色程序分解成为不同的片段和结构。

N3 设计的材质编辑器的目的就是 通过输入和输出参数的重定向,可以拼接不同的着色片段为一个完整的Shader。N 3的着色片段就是 顶点着色程序和像素着色片段

我们先来看个最简单的例子 , 把一个只有 顶点着色的程序片段和一个只有像素着色的片段连接起来, 如下图所示:

Image(5)

要链接两者组成一个完整的着色程序,只需把  像素着色1 的 VS 输入参数1 链接到 顶点着色1的输出参数 PS输出1, 以及像素着色1的 VS输入2 链接到 顶点着色1的输出参数 PS输出2 两者就链接起来了。这个输入与输出的链接,就是说把其中一个的 输出参数当做 另外一个的输入参数。

链接后如下图所示:

Image(6)

如上图一个标准的shader程序就已经完成了。对于上述情况也会存在一些特别地方:比如把一个像素着色程序链接到一个顶点着色程序的时候,如果像素着色的参数,顶点程序无法满足时,比如像素着色需要一个UV坐标,而顶点着色没有UV坐标的生成,这个时候就需要给顶点程序的输入加一个参数,让这个参数以顶点着色程序的名义流入像素着色程序,当顶点程序的输出大于像素着色的输入的时候,这个时候可以忽略,因为只是一个参数没用到而已,下面用图把这两种情况列举出来

Image(7)                用详细的导向描述图如下: Image(8)

上面的红色框代表一个顶点着色程序,有一个Vertex输入,一个const输入, 有三个PS输出。而橙绿色框代表一个像素着色程序,有三个VS输入,一个PS输入. 要链接两个程序,我们需要链接 VS 输入到 PS输入1 , VS输入2链接到PS输入2,但是 VS输入3和PS输出3是不匹配的,这个时候,我们给顶点程序加一个输入参数,名字叫 Vertex-vS 输入3,让这个参数从顶点着色程序经过,然后再直接输出 Vetex-VS输出3,然后再把VS输入3和Vertex-VS输出3链接起来。这样前面提到的像素着色需要的参数顶点着色没提供,顶点着色输出的参数像素着色么有的情形。

有了前面的分析,我们再深入一步,链接多个像素着色和顶点着色片段。我们已经列举了顶点着色和像素着色的链接,下面我们单独说明顶点着色片段之间怎么链接,以及像素着色片段之间怎么链接,有如下的连个顶点着色片段:

Image(9)  和  Image(10)

现在顶点着色片段2的Vertex输入1 和 顶点着色1的PS输入1是一致的,这样链接两者后的图如下:

Image(11)                        我们把图整理一下 :::           Image(12)    把图 分割一下::::             Image(13)

这其中涉及的规则就是所有的输入来自 const, vertex, shared,  而这些输入都是唯一的,在整理顶点着色的输入参数的时候,就是整理Vertex节点中有多少个输出链接。而在整理输出的时候就是整理 Interpolater 节点中有多少个输入链接。 [这个规则其实就是前面重复过的对于五个特殊Node功能的定位]

这样 两个顶点着色片段链接后,变成一个着色片段。  这个着色片段有 4个输入, 3个输出。在整个着色片段中,会定义2个变量的输入结构体,其余两个为 const 变量,会定义三个变量的输出结构体(前提是三个输出不一样)。详细的结构如右边的框图。

对于像素着色程序的链接和顶点程序是一样的原理。如下有三个像素着色片段:

Image(14) Image(15) Image(16)

他们之间存储如下的链接关系:

Image(17)  把图整理一下:Image(18)

接着把图分解成 完整的 顶点着色程序:

Image(19)

完整的像素着色片段已经完成。

有了前面的理论,我们现在对N3的材质编辑器的工作原理做一个简要说明:

先是顶点着色程序,我们顶点着色程序,分为三部分,输入参数,代码,输出参数。顶点着色程序的输入参数会被绑定到节点Vertex, Const, Shared, Sampler, 其中 Vertex 是特殊节点中的特殊节点,他代表的是渲染管道传送过来的渲染数据,主要包括顶点坐标等。而顶点程序的输出参数绑定到Interpolater 节点。当把几个顶点着色程序连接起来的时候,就产生了一个调用链。比如顶点程序1 的输入绑定到顶点程序2的输出参数。通过这种方式,链接起来的调用链,可以通过节点Interpolater的所有输出slot的逆向绑定关系。然后通过遍历Vertex节点的输出slot就可以知道整个程序的输入参数,而访问Interpolater的输出slot,就可以知道整个顶点着色程序的输出参数。 

有了上述的情况说明,N3的材质工具的原理就已经说明了。对于游戏开发中,遇到的材质编辑器也就有了理论上的相关认识。

转载于:https://www.cnblogs.com/JefferyZhou/archive/2012/09/24/2700286.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值