顶点着色器

顶点着色器(vertex shader)是-一段运行在图形卡GPU中的程序,它可取代固定功能流水线中的变换和光照环节(当然,这也不是绝对的,因为在硬件不支持顶点着色器的情况下,Dict3D运行时就会用软件运算方式来模拟顶点着色器)

可以看出,顶点是以局部坐标(局部坐标系中的坐标)输入顶点着色器的,而且顶点着色器必须将照亮的(上色的)顶点输出到齐次裁剪空间中。由于顶点着色器其实就是我们用HLSL语言编写的一段定制程序,这样我们在可实现的图形效果上就获得了很大的灵活性。例如借助顶点着色器,我们就可使用任何可在顶点着色器中实现的光照算法。这样,我们就不再受制于Direct3D的固定功能流水线了。而且这种对顶点位置进行操作的能力具有广泛的应用场合,例织物模拟粒子系统的点尺寸处理顶点融合/变形技术(morphing)等。

此外,可用的顶点数据结构也更加灵活,而且可编程流水线中的顶点结构可以包含比固定功能流水线更加丰富的数据。顶点着色器仍然是一项相对比较新的特性,目前许多图形卡尚不支持该特性,尤其是伴随DirectX9发布的那些比较新的顶点着色器版本。您可通过检查D3DCAPS9结构的成员VertexShaderVersion并与宏D3DVS_VERSION进行比较,来检测您的图形卡是否支持某个顶点着色器版本。D3DVS_VERSION宏中的俩个参数分别表示主版本号和次版本号,目前D3DXCompileShaderFromFile函数支持的顶点着色器版本为1.1、2.0和3.0

//If the device's supported version is less than version 2.0
if(caps.VertexShaderversion < D3DVS_VERSION(2,0))
//Then vertex shader version 2.0 is not supported on this device

顶点声明

到月前为止,我们一直都在用灵活顶点格式(FVF)来描述顶点结构的分量。但是在可编程流水线中,顶点结构甚至可以包含那些超出FVF描述能力的数据。因此,我们通常使用描述能力更强、功能更丰富的顶点声明(vertex declaration)。

在可编程流水线中,如果顶点结构可用FVF来描述,我们仍可使用它。但是这仅仅是为了表示方便,实际上在可编程流水线内部,FVF最终将被转换为顶点声明

顶点声明的描述

我们将顶点声明描述为一个D3DVERTEXELEMENT9类型的结构数组。该结构数组中的每个元素都描述了顶点结构的一个分量。所以,如果您的顶点结构具有3个分量(比如位置、法向量、颜色),则相应的顶点声明就可用一个维数为3的D3DVERTEXELEMENT9类型的结构数组来描述。

typedef struct _D3DVERTEXELEMENT9
{
    WORD    Stream;     // Stream index
    WORD    Offset;     // Offset in the stream in bytes
    BYTE    Type;       // Data type
    BYTE    Method;     // Processing method
    BYTE    Usage;      // Semantics
    BYTE    UsageIndex; // Semantic index
} D3DVERTEXELEMENT9, *LPD3DVERTEXELEMENT9;

Stream:指定与顶点分量关联的数据流

Offset:自顶点数据起始点到与特定数据类型相关的数据的字节偏移量,例如顶点的结构为

struct Vertex
{
    D3DXVECTOR3 pos;
    D3DXVECTOR3 normal;
};

由于分量pos为该结构的第一个分量,所以其相对偏移量为0。而由于sizeof(pos)=12,所以分量normal的相对偏移量为12,即分量normal的位置始于Vertex结构的第12个字节。

Type:指定数据类型,为枚举D3DDECLTYPE的任何一个成员,常用类型为:

  • D3DDECLTYPE_FLOAT1  浮点类型标量(value,0,0,1)
  • D3DDECLTYPE_FLOAT2   浮点类型的2D向量(value,value,0,1)
  • D3DDECLTYPE_FLOAT3   浮点类型的3D向量(value,value,value,1)
  • D3DDECLTYPE_FLOAT4   浮点类型的4D向量
  • D3DDECLTYPE_D3DCOLOR  一个被扩展为RGBA浮点类型颜色向量(r,g,b,a)的D3DCOLOR类型,其中颜色向量的每个分量都被规范化至区间[0,1]内

Method:指定了网格化(tesselation)方法。由于参数涉及到一些高级主题,本书中我们仪使
用默认方法,即用标识符D3DDECLMETHOD_DEFAULT来指定。

Usage:指定了顶点分量的用途。例如某一分量是作为位置向量、法向量还是纹理向量等。合法的用法标识符都取自枚举类型D3DDECLUSAGED3DDECLUSAGE_PSIZE类型用于指定顶点的点尺寸。该类型主要用于点精灵(point sprite),这样我们就可对每个顶点的尺寸进行控制。如果一个顶点声明中具有D3DDECLUSAGE_POSITION,则表明该顶点已经过了变换,并指示图形卡不要将该顶点输送到顶点处理环节中(变换和光照处理)。

UsageIndex:用于标识具有同用法的多个顶点分量。用法索引(usage index)是一个位于区间[0,15]内的整数。例如现在假定我们有3个顶点分量的用法都为D3DDECLUSAGE NORMAL。则我们可按序将这3个顶点分量的用法索引分别指定为0、1、2。按照这种方式,我们就可通过用法索引表示每个特定的法向量。

顶点声明示例:假定我们所要描述的顶点格式包含了一个位置向量和3个法向量,则相应的顶点声明可指定为:

D3DVERTEXELEMENT9 decl[] =
{
{0,0,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{0,12,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,0},
{0,24,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,1},
{0,36,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,2},
D3DDECL_END()
}:

其中,D3DDECL_END宏用于初始化D3 DVERTEXELEMENT9数组中的最后一个顶点元素。同时也请您注意一下不同法向量的用法索引。

顶点声明的创建

一旦将顶点声明描述为一个D3DVERTEXELEMENT9类型的数组,我们就可用CreateVertexDeclaration方法获得指向接IDirect3DVertexDeclaration9的指针:

HERSULT CreateVertexDeclaration(
 CONST D3DVerTEXELEMENT9* pVertexElements,
 IDirect3DVertexDeclaration9** ppDecl
);

//decl是一个D3DVerTEXELEMENT9类型的结构数组
IDirect3DVertexDeclaration9* _decl = 0;
hr = _device->CreateVertexDeclaration(decl,&_decl);

pVertexElements:指向-个D3DVERTEXELEMENT9类型的结构数组,该数组描述了我们想要创建的顶点声明。
ppDecl:用于返回一个指向所创建的IDirect3DVertexDeclaration9接口的指针。

顶点声明的启用

Device->SetFVF(fvf);

//可用下面的代替上面的代码   _decl为IDirect3DVertexDeclaration指针
Device->SetVertexDeclaration(_decl);

顶点数据的使用

我们需要一种方式来定义从顶点声明中的元素顶点着色器的输入结构的数据成员的映射。我们在输入结构中通过为每个数据成员指定一种语义(:usage-type[usage-index])来定义这种映射。该语义通过用法类型用法索引来标识顶点声明中的每个元素。由数据成员的语义所标识的那个顶点元素就是被映射到该数据成员的那个元素。例如,与前面提到的那个顶点声明对应的输入结构为:

struct VS_INPUT
{
    vector position : POSITION;
    vector normal : NORMAL0;
    vector faceNormal1 : NORMAL1;
    vector faceNormal2 : NORMAL2;
};

 其中,decl数组中的由用法POSITION和用法索引0所标识的元素0被映射为输入结构VS_INPUT中的数据成员position。decl数组中的由用法NORMAL和用法索引0标识的元素1被映射为输入结构VS_ INPUT中的数据成员normal。.decl数组中的由用法NORMAL和用法索引1所标识的元素2被映射为输入结构VS_INPUT中的数据成员faceNormall。decl数组中的由用法NORMAL和用法索引2所标识的元素3被映射为输入结构VS_INPUT中的数据成员faceNormal2。如果我们略去了用法索引,就意味着该索引为0。例如,POSITION的含义与POSITION0完全相同。

顶点着色器支持的输入用法包括n为可选整数,区间[0,15]

  • POSITION[n]  位置
  • BLENDWEIGHTS[n]  融合权值(blend weights)
  • BLENDINDICES[n]  融合索引(blend indices)
  • NORMAL[n]  法向量
  • PSIZE[n]  顶点的点尺寸
  • DIFFUSE[n]  漫反射颜色
  • SPECULAR[n]  高光颜色(specular color)
  • TEXCOORD[n]  纹理坐标
  • TANGENT[n]  切向量(tangent vector)
  • BINORMAL[n]  副法向量(binormal vector)
  • TESSFACTOR[n]  网格化因子(tessellation factor)

对于输出结构,我们必须指定每个成员的用途。例如,该数据成员应看作位置向量、颜色向量还是纹理坐标等。对于各数据成员的用途,图形卡无丛知晓,除非您显式指定。这种指定也是在语义层次实现的,例如:

struct VS_OUTPUT
{
    vector position : POSITION;
    vector diffuse : COLOR0;
    vector specular : COLOR1;
};

顶点着色器支持的输出用法包括n为可选整数,区间[0,15]

  • POSITION[n]  位置
  • PSIZE[n]  顶点的点尺寸
  • FOG[n] 雾融合值
  • COLOR[n] 顶点颜色,可输出多个顶点颜色,这些颜色混合在一起生成最终颜色
  • TEXCOORD[n] 顶点纹理坐标 可能输出多个顶点纹理坐标

使用点点着色器的步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day22_mysql

今日内容 零、 复习昨日 一、MySQL 一、约束 1.1 约束 是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新 怎么做? 约束设置的语法,大部分是 create table 表名( 字段 数据类型(长度) 约束, 字段 数据类型(长度) 约束 );1.1 数据类型 其实数据类型…

门店如何设置多个联系电话和营业时间

​小程序中门店信息是非常重要的&#xff0c;通常需要有门店地址、门店电话和营业时间等。采云小程序支持设置多个门店联系电话&#xff0c;避免客户无法联系到门店。而且&#xff0c;也支持设置多个营业时间时段。例如周一到周五早08:00 - 18:00 。客户在周末下单的时候&#…

基于ssm流浪动物救助管理系统

基于ssm流浪动物救助管理系统 摘要 随着城市化的不断发展&#xff0c;流浪动物问题逐渐凸显&#xff0c;而对流浪动物的救助和管理成为社会关注的焦点。本文基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架&#xff0c;设计并实现了一套流浪动物救助管理系统。该系…

初识VBA代码及应用VBA代码第四节:如何录制宏

《VBA之Excel应用》&#xff08;10178983&#xff09;是非常经典的&#xff0c;是我推出的第七套教程&#xff0c;定位于初级&#xff0c;目前是第一版修订。这套教程从简单的录制宏开始讲解&#xff0c;一直到窗体的搭建&#xff0c;内容丰富&#xff0c;实例众多。大家可以非…

uniapp——项目day05

购物车页面 结算区域 把结算区域封装为组件 1. 在 components 目录中&#xff0c;新建 my-settle 结算组件&#xff1a; 2. 初始化 my-settle 组件的基本结构和样式&#xff1a; <template><view class"my-settle-container">结算组件</view> …

Oneid 图计算思路

一、前文 oneid 是用户画像的核心&#xff0c;此文提供图计算的具体方案。 二、方案 注意事项&#xff1a; 1. 业务存在解绑信息&#xff0c;当不与其他业务系统产生关联时&#xff0c;沿用旧oneid。 2. oneid 需要自增&#xff0c;下游系统会用到bitmap等数据类型&#xff0…

2023.11.15使用bootstrap做一个简洁的注册页面

2023.11.15使用bootstrap做一个简洁的注册页面 设置密码必须大于等于6位&#xff0c;并且包含大写字母、小写字母、特殊字符或者数字中的三种。 关注&#xff1a;type"button"和type"submit"之间的区别&#xff1a; type"button"用于普通按钮&…

C# Socket通信从入门到精通(9)——如何设置本机Ip地址

前言&#xff1a; 我们开发好Socket通信程序以后&#xff0c;上机调试的时候&#xff0c;首先要做的就是先设置好电脑的IP&#xff0c;这样才能实现不同的电脑之间的通信&#xff0c;并且电脑1的ip地址和电脑2的Ip地址要同处于一个网段&#xff0c;比如电脑1的Ip地址为192.168…

亚马逊收到CPSC查验通知后卖家需要怎么弄?ASTM F963标准测试 ,CPC认证

收到CPSC查验亚马逊卖家需要怎么做&#xff1f; 。CPSC消费品安全协会&#xff0c;成立于1972年&#xff0c;它的责任是保护广大消费者的利益&#xff0c;通过减少消费品存在的伤害及死亡的危险来维护人身及家庭安全。CPSC现在负责对超过15000种消费品的安全监控&#xff0c;具…

【动态规划】买卖股票的最佳时期含冷冻期

文章目录 一、买卖股票的最佳时期含冷冻期动态规划五部曲 一、买卖股票的最佳时期含冷冻期 题目: 买卖股票的最佳时期含冷冻期 动态规划五部曲 1.确定dp的含义 由题意可知&#xff0c;这里有三种状态 1.买入状态&#xff1a;dp[i][0]:表示第i天处于买入状态时的最大利润为dp[…

新一轮SocialFi浪潮来袭,Atem Network 再次打响注意力争夺战

火爆如潮的 Atem Network 再次从 CyberConnect 以及 Friend.tech 手中接过 SocialFi 赛道的热度大棒&#xff0c;同时这也表明&#xff0c;协议层仍将是 Web3 社交领域的主要叙事。 前不久&#xff0c;Web3社交协议Atem Network 在白皮书中披露了ATEM的代币经济模型&#xff0c…

Linux权限管理

目录 前言 1. Linux权限的概念 2. Linux权限管理 2.1 修改权限 拓展 2.2 修改拥有者 2.3 修改所属组 3. 文件类型 3.1 file指令 4. 权限掩码 umask指令 5.目录权限 6. 粘滞位 总结 前言 Linux作为一款开源操作系统&#xff0c;其权限管理机制是非常重要的一部分。熟练掌…

excel中vlookup用法

excel中vlookup用法 用法示例 参数说明 参数1&#xff1a;E1用于匹配的字段 参数2&#xff1a;E1:F4&#xff0c;匹配表格范围 参数3&#xff1a;要取的字段属于匹配表格范围的第几列 数据4&#xff1a;精确匹配

RequestContextHolder详解

最近遇到的问题是在service获取request和response,正常来说在service层是没有request的,然而直接从controlller传过来的话解决方法太粗暴,后来发现了SpringMVC提供的RequestContextHolder遂去分析一番,并借此对SpringMVC的结构深入了解一下,后面会再发文章详细分析源码 1.Reque…

守护 C 盘,Python 相关库设置

前言 pip 安装依赖和 conda 创建环境有多方便&#xff0c;那 C 盘就塞得就有多满。以前我不管使用什么工具&#xff0c;最多就设置个安装位置&#xff0c;其他都是默认。直到最近 C 盘飙红了&#xff0c;我去盘符里的 AppData 里一看&#xff0c;pip 的缓存和 conda 以前创建的…

物联网AI MicroPython学习之语法 GPIO输入输出模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; GPIO 介绍 模块功能: GPIO通用输入输出。 接口说明 GPIO - 构建GPIO对象 函数原型&#xff1a;Pin(port, dir , pull)参数说明&#xff1a; 参数类型必选参数&#xff1f;说明portintY对应开发板的引脚号…

Debezium-Embedded 实时监控MySQL数据变更

1.Debezium-Embedded 简介 Debezium连接器的操作通常是将它们部署到Kafka Connect服务&#xff0c;并配置一个或多个连接器来监控上游数据库&#xff0c;并为它们在上游数据库中看到的所有更改生成数据更改事件。这些数据更改事件被写入Kafka&#xff0c;在那里它们可以被许多不…

JavaEE进阶学习:Spring 的创建和使用

Spring 就是⼀个包含了众多工具方法的 IoC 容器。既然是容器那么它就具备两个最基本的功能&#xff1a; 将对象存储到容器&#xff08;Spring&#xff09;中从容器中将对象取出来 接下来使用 Maven 方式来创建一个 Spring 项目&#xff0c;创建 Spring 项目和 Servlet 类似&a…

淘宝客APP源码/社交电商自营商城源码/前端基于Uniapp开发

淘宝客APP源码&#xff0c;前端基于Uniapp开发的社交电商自营商城源码。Thinkphp的后台&#xff0c;不是很标准&#xff0c;感兴趣的可以自行研究。 商城功能 1、首页基础装修&#xff1b;2、丰富选品库&#xff1b;3、淘口令解析&#xff1b;4、支持京东&#xff1b;5、支持…

免费IDEA插件分享:Apipost-Helper

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…