HLSL 的基础知识
基础知识很重要,一定要抓牢!
一、数据类型:
HLSL中的数据类型主要有:标准类型、向量、矩阵、和复杂数据类型几大类。
标准数据类型:
标准的数据类型有:bool ,int,half ,float,double.由于某些平台不支持整数值,所以整数可能会用float来模仿。
变量的声明方式和C++差不多一样,就不多说了,强调几个 有区别的点:
1.带const类型修饰符的变量,表示这个量是个常量,不可以被渲染代码修改(和C++也是很类似),这样的变量在声明的时候就需要进行初始化。
2.row_major与col_major修饰符
这类修饰符通常出现在定义矩阵时,房子矩阵类型的前面。用于指定当前声明的矩阵是用列主序还是行主序,列主序,矩阵中的每一列都 会单独存储在一个常量寄存器中,行主序相反。
3.static修饰符
带这个修饰符的变量不仅具有类似于C++中的静态变量的功能,还有防止该变量暴露给应用程序的作用,在调用该HLSL文件的程序中不可以访问和更改这个变量。
4.extern修饰符
含义与static相反,一个变量不可以同时声明static和extern两个修饰符类型,程序可以通过SetVertexShaderConstantB函数或者ID3DXConstantTable借口的函数来设置一个extern类型变量,如果没有用修饰符,默认的就是extern修饰。
5.uniform
用该修饰符修饰的变量只能使用API方法来改变,并且只能在两次绘制之间被改变。
6.shared
共享变量,表名该变量可以在不同的效果中被共享。
向量
向量是一种特殊的数据结构,一个响亮可能包含1-4个元素,比如:bool bv//标量 bool1 bv //一维向量 float1 fv//一维向量
float2 fv//二维向量
初始化可以和声明同时进行,如:half2 hv={0.2,0.3};
另一种声明方式是在一个尖括号中指明变量的类型和个数:vector<bool ,1> bv=FALSE;
向量的存取:一个向量最多可以包括4个元素,每个都可以通过两种命名集合来寻址,一种是位置集合,它使用x、y、z另一种是通过颜色集合:r g b a
向量的混合存取:一次读取向量中的两个元素是混合存取,比如:float2 f_2D; float4 pos;
f_2D=pos.xy;
向量的数学运算:乘法是最需注意的,有两种乘法,*表示矩阵之间相乘,用*乘出来的值仍然是一个矩阵,还有一个乘法函数:dot(),点乘,矩阵用点乘运算生成的是一个值,学过矩阵的话,这点应该不难明白。
矩阵
矩阵这个概念大家应该不陌生,用HLSL声明一个矩阵的方法:float4x4 表示4行4列的矩阵,注意是先行后列,double2x4表示2行4列的矩阵.
另一种声明的方式和声明向量的另一种方式很像,在一个尖括号中指定该矩阵的类型和矩阵的行数和列数:matrix<float,2,2>fM={0.0f,0.1f,2.1f,2.2f};
矩阵元素的存取:可以通过"."来取数值.具体的办法由两种,一种是 0基准 行列位置法,另一种是 1基准 行列位置法,两种基准法就和它的名字一样,起始下标的值不同罢了。_m00 _11表示的同一个元素即矩阵中的第一个元素。
矩阵的混合存取:和向量差不多。比如_m00_m11表示取出来了两个元素
矩阵的数组存取方式:就是用方括号括起来的下标进行存取,比如M是一个矩阵 M[0][0]=M_m00=M_11.注意:矩阵存取不可把用"."的方式和用数组的方式混合起来使用,用数组方式也不能实现混合存取矩阵.
矩阵的数学运算:需要注意的是用*进行存储的话,并不是实现的矩阵的额相乘运算,比如 M3=M1*M2;M3中的第一个元素的值是M1._11*M2_22; 如果要做矩阵的相乘运算的话,需要用mul()函数进行计算。
复杂的数据类型
复杂的数据类型包含:采样器(sampler)、结构体(structure)、渲染器(shader)等等。
1. 采样器
一个采样器包含有采样状态。采样状态指定被采样的纹理,并控制纹理采样期间的纹理过滤。采样一副纹理需要一副纹理、一个采样器(带有采样状态)、一个采样指令。
采样器可以在其初始化的同时初始化其纹理和采样状态:
texture tex0;
sampler2D s_2D=salmpler_state
{
Texture=<tex0>;
MinFilter=Linear;
MagFilter=Linear;
AddressU=Wrap;
AddressV=Wrap;
};
使用上面定义的纹理采样器 一副2D的纹理的代码如下:
float2 sample_2D(float2 tex:TEXCOORD0):COLOR
{
return tex2D(s_2D,tex);
}
上面的例子中,使用texture类型变量tex0表示一个纹理对象,使用sampler2D类型和关键字smpler_state声明了一个采样器对象s_2D,这个采样器在大括号内指定了要采样的纹理和相关的采样状态。
注意:如果采样其中没有指定纹理的采样状态,将使用默认的采样状态:纹理过滤选择线性过滤,纹理寻址模式将采用重叠寻址模式。
上面的例子中,采样函数用一个二元的浮点纹理坐标作为输入,并返回一个二元的颜色值,这个是用函数的返回值类型决定的,float2表示返回的数据中含有两个元素的色彩值,它表示了红色和绿色的元素。
HLSL支持4中纹理 类型:sampler1D,sampler2D,sampler3D,samplerCUBE。对应的纹理采样函数是:tex1D、tex2D、tex3D、texCUBE,我们看一个3D采样的例子:
texture tex0;
sampler3D s_3D=sample_state
{
texture=<tex0>;
};
float3 sample_3D(float3 tex:TEXCOORD0):COLOR
{return tex3D(s_3D,tex);}
2. 结构体
和C++中的结构体差别不大.
注意:在结构体里面的变量不可以带有范围的关键字修饰符 如:static等。
3. 顶点渲染对象
一个vertexshader类型变量代表了一个顶点渲染对象。
4. 像素渲染对象
一个pixelshader类型的变量就是一个像素渲染对象。
5. 纹理
texture类型的变量表示一个纹理对象。这个类型用于在效果中设置一个纹理到设备。
HLSL 的基础知识相关推荐
- 计算机图形渲染基础知识(个人笔记)
一,什么是计算机图形学 对于我个人来说,计算机图形学是用计算机来表示图形,并且运用复杂的数学运算来生成图形的一门科学. 二,计算机图形学能干什么? 计算机图形学能制作粒子特效,动画,渲染,虚拟显示,增 ...
- 嵌入式Linux的OTA更新,基础知识和实现
嵌入式Linux的OTA更新,基础知识和实现 OTA updates for Embedded Linux, Fundamentals and implementation 更新的需要 一旦嵌入式Li ...
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...
注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...
- 《计算机网络应用基础》模拟试卷(六),《计算机与网络应用基础知识1》模拟试卷...
<计算机与网络应用基础知识1>模拟试卷 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 <计算机与网络应用基础知识1& ...
- python向量计算库教程_NumPy库入门教程:基础知识总结
原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...
- python常用变量名_python基础知识整理
Python Python开发 Python语言 python基础知识整理 序言:本文简单介绍python基础知识的一些重要知识点,用于总结复习,每个知识点的具体用法会在后面的博客中一一补充程序: 一 ...
- 计算机基础知识掌握欠缺,《计算机基础知识》实验教学改革探讨.pdf
<计算机基础知识>实验教学改革探讨.pdf Science& TechnologyVision 科 技 视 界 科技 探·索·争鸣 计<算机基础知识>实验教学改革探讨 ...
- python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)
前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些东西已经有了,不妨直接去 github 上搜,用 ...
最新文章
- 2022-2028年中国超高清视频产业投资分析及前景预测报告
- mysql 创建和删除库_Mysql创建和删除数据库
- Containers vs Serverless:怎么选择?
- C# 以日期时间作为文件名学习总结
- python pycharm 增量选择 ctrl+w
- freebsd mysql57_Freebsd7.2下Ports安装PHP5、MySql5.4、Apache22
- jdk 8 时区 转换_使用JDK 8将收藏转换为地图
- oracle between and monday,oracle——时间
- 界面设计与测试的规范
- vmware克隆linux虚拟机网卡无法上网的解决办法
- Lua新闻组的其人其事(一)
- 双系统如何在Centos7中添加GRUB2启动项
- APICS与AX的Master Planning(一)--Phantom bill of Material 虚项
- MATLAB基础篇——线性代数应用
- python中自定义标识符_python标识符
- STM8S003 AWU休眠唤醒 寄存器和库函数2种做法
- diybox路由器设置教程_一个简单的无线路由器入门设置教程,非常实用
- 探索Ristretto量化工程—问题记录
- redirectType=Found和redirectType=Permanent哪个是301哪个是302?
- 多智能体强化学习入门(七)——AC for CDec-POMDP 大规模规划学习算法
热门文章
- 涨姿势!摹客切图小技巧
- 网易微专业web前端开发课程视频教程分享
- MS弹出ERROR: Check license - This feature is not available. A valid license is required to use it.
- 基于android的个人理财软件 android stu_Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)...
- 财务分析之利润表、现金流量表
- 微信开放平台开源_开源的价值在于开放的开发过程
- 共享打印机的客机显示脱机怎么解决?
- 计算机系统文件命名规则,电脑新建文件夹等的默认命名如何修改?[多图]
- 联通光纤猫虚拟服务器设置,【2017年整理】联通光猫配置操作手册.doc
- web前端面试题之肉(css)