DirectX9:高级着色语言(HLSL)
一.简介
高级着色语言(High)可以编写顶点着色器和像素着色器,取代固定功能流水线中的部分功能,在图形卡的GPU(Graphics Processing Unit,图形处理单元)中执行
注意:如果图形卡不支持顶点着色器和像素着色器,可以切换为REF设备,但是这个设备会运行很慢
Shader language目前有3种主流语言:基于OpenGL的GLSL(OpenGL Shading Language)
基于Direct3D的HLSL(High Level Shading Language)
NVIDIA公司的Cg(C for Graphic)语言
在以前的显卡中,图像的呈现就像流水线一样,不能够进行编程.后来有了GPU,就可以通过编程来让GPU进行计算.
二.D3DXCompileShaderFromFile()
可以用.txt文本文件来存储着色器代码,再用D3DXCompileShaderFromFile()来加载
HRESULT D3DXCompileShaderFromFile(
LPCSTR pSrcFile,
CONST D3DXMACR0* pDefines,
LPD3DXINCLUDE pInclude,
LPCSTR pFunctionName,
LPCSTR pTarget,
DWORD Flags,
LPD3DXBUFFER* ppShader,
LPD3DXBUFFER* ppErrorMsgs,
LPD3DXCONSTANTTABLE* ppConstantTable
);
// 调用D3DXCompileShaderFromFile ID3DXConstantTable* TransformConstantTable = 0;
ID3DXBuffer* shader = 0;
ID3DXBuffer* errorBuffer = 0; hr = D3DXCompileShaderFromFile(
"transform.txt",
0,
0,
"Main",
"vs_2_0",
D3DXSHADER_DEBUG,
&shader,
&errorBuffer,
&TransformConstantTable); if(errorBuffer)
{
::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
d3d::Release<ID3DXBuffer*>(errorBuffer);
} if(FAILED(hr))
{
::Message(0, "D3DXCreateEffectFromFile()", 0, 0);
return false;
}
三.HLSL(高级着色器语言)语法
1.常量
每一个着色器都有一个常量表,它是用来存储着色器的变量.
在 D3DX 库中有 ID3DXConstantTable 接口来访问着色器的常量表,通过这个接口可以设置着色器源代码中的变量
(1) 获取常量句柄
D3DXHANDLE ID3DXConstantTable::GetConstantByName(
D3DXHANDLE hConstant,
LPCSTR pName // 指向在着色器源代码中的变量
);
D3DXHANDLE h0;
h0 = ConstTable->GetConstantByName(0, "ViewProjMatrix");
(2) 设置常量
// 设置布尔值
bool b = true;
ConstTable->SetBool(Device, handle, b); // 设置布尔数组
bool b[3] = {true, false, true};
ConstTable->SetBoolArray(Device, handle, b, 3); // 设置浮点数
float f = 3.14f;
ConstTable->SetFloat(Device, handle, f); // 设置浮点数组 // 设置整数
int x = 4;
ConstTable->SetInt(Device, handle, x); // 设置整数数组
int x[4] = {1, 2, 3, 4};
ConstTable->SetIntArray(Device, handle, x, 4); // 设置一个4*4的矩阵
D3DXMATRIX M(...);
ConstTable->SetMatrix(Device, handle, &M); // 设置一个4*4的矩阵数组
D3DXMATRIX M[4];
ConstTable->SetMatrixArray(Device, handle, M, 4); // 设置一个4*4的矩阵指针的数组
D3DXMATRIX* M[4];
ConstTable->SetMatrixPointerArray(Device, handle, M, 4); // 设置一个4*4的矩阵的转置
D3DXMATRIX M(...)
D3DXMatrixTranspose(&M, &M);
ConstTable->SetMatrixTranspose(Device, handle, &M); // 设置一个4*4的矩阵转置的数组
D3DXMATRIX M[4];
ConstTable->SetMatrixTransposeArray(Device, handle, M, 4); // 设置一个4*4矩阵转置的指针的数组
D3DXMATRIX* M[4];
ConstTable->SetMatrixTransposePointerArray(Device, handle, M, 4); // 设置一个 D3DXVECTOR4类型的变量
D3DXVECTOR4 v(1.0f, 2.0f, 3.0f ,4.0f);
ConstTable->SetVector(Device, handle, &v); // 设置一个向量的数组
D3DXVECTOR4 v[3];
ConstTable->SetVectorArray(Device, handle, v, 3); // 用来设置一个任意大小类型
D3DXMATRIX M(...)
ConstTable->SetValue(Device, handle, (void*)&M, sizeof(M));
(3) 设置常量默认值
HRESULT ID3DXConstantTable::SetDefaults(
LPDIRECT3DDEVICE9 pDevice
);
2.全局变量
3.内置变量
bool--true/false,HLSL提供true和false关键字
int--32位有符号整数
half--16位浮点数
float--32位浮点数
double--64位浮点数
4.向量类型
vector是一个4D向量,每个分量都是float类型
vector<T,n>是一个n(1~4)维向量,每个分量都是T类型,
5.矩阵类型
matrix是一个4*4矩阵,每个分量都是float类型
matrix<T,m,n>是一个m*n(1~4)维向量,每个分量都是T类型
6.数组类型
float M[4][4]; half p[4]; vector v[12];
7.结构体类型
struct MyStruct
{
matrix T;
vector n;
float f;
int x;
bool b;
}; MyStruct s;
s.f = 5.0f;
8.类型转换
// 强制类型转换 float f = 5.0f;
matrix m = (matrix)f;
9.关键字
asm bool compile const decl do
double else extern false float for
half if in inline inout int
matrix out pass pixelsshader return sampler
shared static string struct technique texture
true typedef uniform vector vertexshader void
volatile while
- typedef
// 将向量类型命名为点point typedef const float CFLOAT;
typedef vector<float, 3> point;
Point myPoint;
10.操作符
11.自定义函数
12.内置函数
在DirectX文档中Content标签页下的 DirectX Graphics \ Reference \ Shader Reference \ High Level Shader Language \ Intrinsic Functions中就可以找到内置HLSL函数的完整列表
abs(x) 返回 |x|
ceil(x) 返回 >=x 的最小整数
clamp(x, a, b) 在[a, b]范围内选取(如果在范围内就返回x,如果不是就返回a或b)
cos(x) 返回 x 的余弦值,这里x是弧度值
cross(u, v) 返回 u 和 v 的叉乘结果
degrees(x) 将 x 从弧度转换为角度
determinant(M) 返回矩阵 M 的行列式det(M)
distance(u, v) 返回 u 点和 v 点之间的距离 |v - u|
dot(u , v) 返回 u 和 v的点乘结果
floor(x) 返回 <= x的最大整数
length(v) 返回 |v|
lerp(u, v, t) 在 u 和 v 之间线性插值,根据参数t(0 <= t <= 1)
log(x) 返回 ln(x)
log10(x) 返回 log10(x)
log2(x) 返回 log2(x)
max(x, y) 如果 x >= y,则返回x,否则返回y
min(x, y) 如果 x <= y,则返回x,否则返回y
mul(M, N) 返回矩阵乘积 MN
normalize(v) 返回 v/ |v| (单位化向量)
pow(b, n) 返回 b 的 n 次方
radians(x) 将 x 从角度转换为弧度
reflect(v, n) 给定向量 v 和表面法线 n,计算其反射向量
refract(v, n, eta) 给定向量 v 表面法线 n 和两种材质的两个折射索引的比率 eta,计算其反射向量
rsqrt(x) 返回 x 的平方根的倒数
saturate(x) 返回clamp(x, 0.0, 1.0)
sin(x) 返回 x 的正弦,其中 x 为弧度值
sincos(int x, out s,out c) 返回 x 的正弦和余弦,其中 x 为弧度值
sqrt(x) 返回 x 的平方根
tan(x) 返回 x 的正切,其中 x 为弧度值
transpose(M) 返回矩阵的转置M
float x = sin(1.0f);
float y = sqrt(4.0f); vector u = {1.0f, 2.0f, -3,0f, 0.0f};
vector v = {3.0f, -1.0f, 0.0f, 2.0f};
float s = dot(u, v); float3 i = {1.0f, 0.0f, 0.0f};
float3 j = {0.0f, 1.0f, 0.0f};
float3 k = cross(i, j); matrix<float, 2, 2> M = {1.0f, 2.0f, 3.0f, 4.0f};
matrix<float, 2, 2> T = transpose(M);
四.HLSL(高级着色器语言)构成
1.输入输出结构
// 该顶点着色器对顶点实施了取景变换(view transformation)和投影变换(projection transform),并将顶点的漫反射颜色分量设为蓝色 // 一个HLSL内置的4*4矩阵类型,存储的是一个视图矩阵和投影矩阵的乘积
matrix ViewProjMatrix; // 一个HLSL内置的4D向量类型,初始化为RGBA颜色的蓝色向量
vector Blue = {0.0f, 0.0f, 1.0f, 1.0f}; // 着色器输入结构的顶点数据
struct VS_INPUT
{
// 位置分量
vector position : POSITION;
}; // 着色器输出结构的顶点数据
struct VS_OUTPUT
{
// 位置分量 颜色分量
vector position : POSITION;
vector diffuse : COLOR;
};
// 另一种入口 函数的表示方法 struct INPUT
{
float2 base : TEXCOORD0;
float2 spot : TEXCOORD1;
float2 text : TEXCOORD2;
}; struct OUTPUT
{
float4 c : COLOR;
};
2.入口函数
// 主入口函数,输入顶点数据,返回输出顶点数据
VS_OUTPUT Main(VS_INPUT input)
{
// 所有成员的值设为0
VS_OUTPUT output = (VS_OUTPUT)0; // 矩阵相乘
output.position = mul(input.position, ViewProjMatrix); // 漫反射分量
output.diffuse = Blue;
return output;
}
float4 Main(int float2 base : TEXCOORD0,
int float2 spot : TEXCOORD1,
int float2 text : TEXCOORD2) : COLOR
{
..
}
DirectX9:高级着色语言(HLSL)的更多相关文章
- 有关OpenGL着色语言(一)
刚接触OpenGL着色语言...,不定期增加内容 1.OpenGL着色语言(GLSL)是什么? 用于OpenGL的面向过程的高级着色语言,是近年来图形编程领域中出现的最重要的新型开发技术,使用Open ...
- Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.
这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...
- win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)
一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...
- 着色语言(Shader Language)
摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...
- OpenGL ES 着色语言
OpenGL 着色器中使用的是着色语言GLSL.着色语言源自C语言,提供了丰富的原生类型,如向量.矩阵等,还有大量的内建函数,这在处理3D图形时可以更加高效.易用.下面是整理的是OpenGL ES2. ...
- OPENGL学习笔记整理(五):着色语言
有些事情本身就是十分奇怪的.在传统上,图形硬件的设计目的是用于快速执行相同的硬编译指令集.不同的计算步骤可以被跳过,参数可以被调整,但计算本身确实固定不变的.然而,随着技术的发展,却越来越变得可以编程 ...
- GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...
- OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)
上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...
- OpenGL12-shader(GLSL)着色语言1(代码已上传)
OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...
随机推荐
- k8s-存储卷2-configMap-Secret-十三
一.StorageClass 在前一篇文章中,手动定义了pv,并让pvc关联至pv:现实中在pvc申请存储空间时,未必就有现成的pv符合pvc申请的需求,该怎么办呢? Kubernetes提供了描述存 ...
- Thrift 使用TNonblockingServer模型时调用PosixThreadFactory出错。
Thrift 使用TNonblockingServer模型时调用PosixThreadFactory出错. 我定位到shared_ptr<PosixThreadFactory> thr ...
- python 字符串操作二 内建函数
一.查看字符串的内建函数 >>> dir(str) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__' ...
- combobox级联检索下拉选择框
1.效果图 2.前端 @{ ViewBag.Title = "Index"; Layout = null; @*自动筛选下拉框*@ <script src="~/S ...
- 黑客攻防技术宝典web实战篇:工具web服务器习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 在什么情况下 Web 服务器会显示目录列表? 如果请求某目录的 URL 且满足以下条件,W ...
- Udp实现省略编码
class My_Socket(socket.socket): def __init__(self, encoding='utf-8'): self.encoding = encoding super ...
- Chips CodeForces - 333B
Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...
- JavaScript--字符串常用方法总结
JavaScript--字符串常用方法总结 举例模板: var str = "what are you " var str1 = "sss" var txt = ...
- 题解报告:hdu 1520 Anniversary party(树形dp入门)
Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...
- 转 Oracle中merge into的使用
http://www.cnblogs.com/highriver/archive/2011/08/02/2125043.html