1.3怎么写HLSL着色器
我们可以直接把HLSL着色器代码作为一长串字符串编写进我们的应用程序源文件中,但是,更加方便和模块化的方法是把着色器的代码从应用程序代码中分离出来。因此,我们将着色器代码单独保存为文本格式,然后在应用程序中使用特定函数将其加载进来。
下面是一个完整的HLSL着色器程序代码,我们把它保存在BasicHLSL.txt中。该着色器完成顶点的世界变换、观察变换和投影变幻,并将顶点颜色设定为指定的颜色。
//
// BasicHLSL.txt
//
//
// Global variable
//
matrix WVPMatrix;
vector color;
//
// Structures
//
struct VS_INPUT
{
vector position : POSITION;
};
struct VS_OUTPUT
{
vector position : POSITION;
vector color : COLOR;
};
//
// Functions
//
VS_OUTPUT SetColor(VS_INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.position = mul(input.position, WVPMatrix);
output.color = color;
return output;
}
下面就针对上述代码讲解一下HLSL着色器程序的编写:
1.3.1全局变量
代码中声明了两个全局变量:
matrix WVPMatrix;
vector color;
变量WVPMatrix是一个矩阵类型,它包含了世界、观察、投影的合矩阵,用于对顶点进行坐标变换;
变量color是一个向量类型,它用于设定顶点颜色;
代码中并没有对全局变量进行初始化,这是因为我们对全局变量的初始化过程将在应用程序中进行,全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在。具体赋值过程将在后续部分讲述。
1.3.2输入输出
² 输入输出结构
程序中定义了两个输入输出结构VS_INPUT和VS_OUTPUT
struct VS_INPUT
{
vector position : POSITION;
};
struct VS_OUTPUT
{
vector position : POSITION;
vector color : COLOR;
};
自定义的结构可以采用任意名称,结构不过是一种组织数据的方式,并不是强制的,你也可以不使用,而将本程序的输入改为:
vector position : POSITION;
² 标志符
用于输入输出的变量采用用一种特殊的声明方式:
Type VariableName : Semantic
这个特殊的冒号语法表示一个语义,冒号后面的标志符用来指定变量的用途,如
vector position : POSITION;
其中,POSITION标志符表明该变量表示顶点位置,另外还有诸如COLOR、NORMAL等很多表示其他意义的标志符。
本节所说的输入输出其实是指着色器代码和编译器、GPU之间的通信,和应用程序是无关的,所以这些变量不需要在应用程序中进行赋值,标志符告诉编译器各个输入输出变量的用途(顶点位置、法线、颜色等),这是着色器代码和编译器、GPU之间通信的关键。
1.3.3入口函数
程序中还定义了一个函数SetColor:
OUTPUT SetColor(INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.position = mul(input.position, WVPMatrix);
output.color = color;
return output;
}
1. 该函数以input和output类型作为输入输出;
2. 使全局变量WVPMatrix和input.position相乘,以完成顶点的世界、观察、投影变换,并把结果赋值到output.position;
output.position = mul(input.position, WVPMatrix);
3. 将全局变量color的值赋给output.color;
output.color = color;
4. 在同一个着色器代码文件中,可以有多个用户自定义函数,因此在应用程序中需要指定一个入口函数,相当于windows程序的WinMain函数,本程序只包含SetColor一个函数而且它将被做为入口函数使用。
1.3.4总结
至此,一个HLSL着色器编写完毕,渲染过程中,当一个顶点被送到着色器时:
1. 全局变量WVPMatrix、color将在应用程序中被赋值;
2. 入口函数SetColor被调用编译器根据标志符将顶点信息填充到VS_INPUT中的各个字段;
3. SetColor函数中,首先定义一个VS_OUTPUT信息,之后根据WVPMatrix和color变量完成顶点的坐标变换和颜色设定操作,最后函数返回VS_OUTPUT结构;
4. 编译器将会再次根据标志符把返回的VS_OUTPUT结构中的各字段映射为顶点相应的信息。
5. 顶点被送往下一个流程接受进一步处理。
上述过程中,全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在;标志符告诉编译器各个输入输出变量的用途(顶点位置、法线、颜色等),这是着色器代码和编译器、GPU之间通信的关键。个人认为这是着色器中最为精义的地方:)
分享到:
相关推荐
##### 1.3 怎么写HLSL着色器 HLSL着色器的编写通常采用独立于主程序的方式,这样可以提高代码的复用性和维护性。下面是一个简单的HLSL顶点着色器示例,这个着色器完成顶点的世界变换、观察变换和投影变换,并为每个...
#### 1.3 怎么写HLSL着色器 编写HLSL着色器涉及以下几个关键部分: 1. **全局变量**:这些变量在整个着色器中可见,可以用来存储常量、纹理坐标或其他需要在多个函数间共享的数据。 2. **输入输出**:着色器之间...
**1.3 怎么写HLSL着色器** 编写HLSL着色器通常有几种不同的方式,但最常见的是将着色器代码保存为独立的文本文件。这样做不仅可以提高代码的模块化程度,还便于维护和重用。例如,可以创建一个名为`BasicHLSL.txt`...
##### 1.3 怎么写HLSL着色器 HLSL着色器通常包含全局变量、结构体和函数等元素。下面是一个简单的顶点着色器示例: ```hls // BasicHLSL.txt // 全局变量 matrix WVPMatrix; vector color; // 结构体定义 struct ...
##### 1.3 如何写HLSL着色器? - **1.3.1 全局变量**:在HLSL中,可以通过声明全局变量来保存常量或共享数据。例如: ```hls float4x4 g_WorldViewProj; ``` - **1.3.2 输入输出**:着色器之间可以通过传递...
#### 1.3 如何编写HLSL着色器? 编写HLSL着色器涉及多个方面,包括全局变量声明、结构体定义、函数编写等。下面通过一个简单的例子来了解这些基本概念。 ##### 1.3.1 全局变量声明 HLSL支持多种数据类型,包括...
#### 1.3 如何编写HLSL着色器 HLSL代码通常被存储在独立的文本文件中,然后在运行时加载到应用程序中。例如,一个简单的HLSL顶点着色器可能包含世界、观察和投影矩阵的组合,以及顶点位置和颜色的处理: ```hlsl /...
##### 1.3 如何编写HLSL着色器? 编写HLSL着色器通常有两种方法: 1. **内嵌于应用程序源文件**:可以将HLSL代码作为字符串直接写入应用程序源文件中。 2. **独立的文本文件**:更推荐的方式是将着色器代码保存在...
5. **HLSL着色器**:所有这些处理都可以通过编写HLSL着色器来完成。在irrlicht引擎中,你需要创建一个自定义的渲染管线,替换默认的像素和顶点着色器,将卡通渲染逻辑集成到这些着色器中。 6. **...
Shader Forge是Unity3D开发中的一个强大工具,它允许开发者通过直观的图形界面来创建自定义着色器,而无需深入理解复杂的Shader语言如GLSL或Unity内置的Cg/HLSL。在这款1.3.8.0版本中,我们能够期待一系列的功能和...
16.2.2 HLSL着色器程序的编译 272 16.3 变量类型 274 16.3.1 标量类型 274 16.3.2 向量类型 274 16.3.3 矩阵类型 275 16.3.4 数组 277 16.3.5 结构体 277 16.3.6 关键字typedef 277 16.3.7 变量的前缀 278 ...
总的来说,"Unity Shader Forge 1.3.8.0.zip"这个压缩包包含的是一个增强Unity 3D着色器开发效率的工具,它的可视化界面和丰富的节点库让Shader编程变得更加易用和高效。如果你是Unity开发者,尤其是对Shader编程不...
- **7.4 链接和使用着色器**:解释了如何将多个着色器对象链接成一个着色器程序,并如何使用该程序进行渲染。 - **7.5 清理工作**:介绍了如何释放不再使用的着色器资源。 - **7.6 查询函数**:列举了可用于查询着色...
"Distortion Shader Pack 1.3.rar"是一个专为Unity设计的扭曲效果着色器包,它包含了一系列精心制作的shader资源,旨在帮助开发者创造出各种引人注目的扭曲效果,从而提升游戏或应用的视觉冲击力。 首先,我们来...
在Unity中,着色器通常是通过编写GLSL或HLSL语言的代码来实现的,这对初学者或者不熟悉编程的艺术家来说是一个挑战。Shader Forge通过其直观的图形用户界面(GUI)解决了这个问题,允许用户通过拖拽节点,连接不同的...
随着 GPU 技术的发展,现代图形卡支持可编程着色器,包括顶点着色器和片段着色器(像素着色器),这使得开发者可以通过编写自定义的 GLSL (OpenGL Shading Language) 或 HLSL (High-Level Shader Language) 代码来...
其中,Amplify Shader Editor(ASE)是一款专为Unity3D设计的强大着色器编辑器,它极大地简化了着色器的创建过程,让开发者能够更加直观、高效地构建出复杂的图形效果。本文将深入探讨Amplify Shader Editor的核心...