1.4怎么用HLSL着色器
应用程序中对HLSL着色器的使用分为以下步骤:
1. 加载(称为编译更为妥当)着色器代码;
2. 创建(顶点/像素)着色器;
3. 对着色器中的变量进行赋值,完成应用程序和着色器之间的通信。
4. 把着色器设定到渲染管道中;
本例使用的着色器是一个顶点着色器,因此我们将通过顶点着色器的使用来讲解着色器的使用过程,像素着色器的使用过程与此大同小异,二者之间仅有些微差别。
1.4.1声明全局变量
IDirect3DVertexShader9* BasicShader = 0; //顶点着色器指针
ID3DXConstantTable* BasicConstTable = 0; //常量表指针
D3DXHANDLE WVPMatrixHandle = 0;
D3DXHANDLE ColorHandle = 0;
ID3DXMesh* Teapot = 0; //指向程序中D3D茶壶模型的指针
1.4.2编译着色器
通过D3DXCompileShaderFromFile函数从应用程序外部的文本文件BasicHLSL.txt中编译一个着色器:
//编译后的着色器代码将被放在一个buffer中,可以通过ID3DXBuffer接口对其进行访问,之后的着色器将从这里创建
ID3DXBuffer* shaderBuffer = 0;
//用于接受错误信息
ID3DXBuffer* errorBuffer = 0;
//编译着色器代码
D3DXCompileShaderFromFile("BasicHLSL.txt", //着色器代码文件名
0,
0,
"SetColor", //入口函数名称
"vs_1_1", //顶点着色器版本号
D3DXSHADER_DEBUG,// Debug模式编译
&shaderBuffer, //指向编译后的着色器代码的指针
&errorBuffer,
&BasicConstTable); //常量表指针
1.4.3创建着色器
应用程序通过CreateVertexShader创建一个顶点着色器,注意使用了上一步得到的shaderBuffer:
g_pd3dDevice->CreateVertexShader((DWORD*)shaderBuffer->GetBufferPointer(), &BasicShader);
1.4.3对着色器中的变量进行赋值
1.3.4节说到着色器的全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在,这里就具体说明赋值过程。
着色器中的全局变量在编译后都被放在一个叫常量表的结构中,我们可以使用ID3DXConstantTable接口对其进行访问,参照1.4.1中编译着色器函数D3DXCompileShaderFromFile的最后一个参数,该参数即返回了指向常量表的指针。
对一个着色器中变量进行赋值的步骤如下:
1. 通过变量名称得到指向着色器变量的句柄;
还记得在BasicHLSL.x着色器文件中我们声明的两个全局变量吗:
matrix WVPMatrix;
vector color;
我们在应用程序中相应的声明两个句柄:
D3DXHANDLE WVPMatrixHandle = 0;
D3DXHANDLE ColorHandle = 0;
然后通过变量名得到分别得到对应的两个句柄:
WVPMatrixHandle = BasicConstTable->GetConstantByName(0, "WVPMatrix");
ColorHandle = BasicConstTable->GetConstantByName(0, "color");
2. 通过句柄对着色器变量进行赋值;
我们可以先设置各变量为默认值:
BasicConstTable->SetDefaults(g_pd3dDevice);
之后,可以使用ID3DXConstantTable::SetXXX函数对各个变量进行赋值:
HRESULT SetXXX(
LPDIRECT3DDEVICE9 pDevice,
D3DXHANDLE hConstant,
XXX value
);
其中XXX代表变量类型,例如Matrix类型的变量就要使用SetMatrix函数赋值,而Vector类型的则要使用SetVector来赋值。
1.4.4把着色器设定到渲染管道中
这里我们使用SetVertexShader方法把顶点着色器设定到渲染管道中:
g_pd3dDevice->SetVertexShader(BasicShader);
1.4.5整个渲染过程如下
在渲染过程中,我们设定顶点的变换坐标和颜色值,渲染代码如下:
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(153,153,153), 1.0f, 0 );
//开始渲染
g_pd3dDevice->BeginScene();
//得到世界矩阵、观察矩阵和投影矩阵
D3DXMATRIX matWorld, matView, matProj;
g_pd3dDevice->GetTransform(D3DTS_WORLD, &matWorld);
g_pd3dDevice->GetTransform(D3DTS_VIEW, &matView);
g_pd3dDevice->GetTransform(D3DTS_PROJECTION, &matProj);
D3DXMATRIX matWVP = matWorld * matView * matProj;
//通过句柄对着色器中的WVPMatrix变量进行赋值
BasicConstTable->SetMatrix(g_pd3dDevice, WVPMatrixHandle, &matWVP);
D3DXVECTOR4 color(1.0f, 1.0f, 0.0f, 1.0f);
//通过句柄对着色器中的color变量进行赋值,这里我们赋值为黄色
BasicConstTable->SetVector(g_pd3dDevice, ColorHandle, &color);
//把顶点着色器设定到渲染管道中
g_pd3dDevice->SetVertexShader(BasicShader);
//绘制模型子集
Teapot->DrawSubset(0);
//渲染完毕
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
编译运行程序,运行效果如图1.2所示,这里我们将顶点颜色设置为黄色,如果读者在渲染过程中不断变换对着色器变量color的赋值,你将会得到一个色彩不断变幻的D3D茶壶。
D3DXVECTOR4 color(1.0f, 1.0f, 0.0f, 1.0f); //读者可以尝试改变颜色值
BasicConstTable->SetVector(g_pd3dDevice, ColorHandle, &color);
图1.2 着色器效果
分享到:
相关推荐
#### 1.4 怎么用HLSL着色器 应用HLSL着色器包括以下步骤: 1. **声明全局变量**:在C++代码中,你需要声明与HLSL着色器中定义的全局变量相对应的变量,这样可以在CPU和GPU之间交换数据。 2. **编译着色器**:使用...
**1.4 怎么用HLSL着色器** 使用HLSL着色器涉及到几个步骤:加载着色器代码、编译着色器、创建着色器对象以及设置着色器参数。例如,在C++应用程序中,可以使用`ID3D11Device::CreateVertexShader`和`ID3D11Device::...
##### 1.4 怎么用HLSL着色器 在DirectX应用程序中使用HLSL着色器,首先需要创建着色器对象并编译着色器代码。接着,将编译后的着色器对象绑定到渲染管线中相应的阶段(如顶点着色器或像素着色器)。具体步骤如下: ...
##### 1.4 如何使用HLSL着色器? - **1.4.1 声明全局变量**:在着色器中声明全局变量,例如: ```hls float4x4 g_WorldMatrix; float4x4 g_ViewMatrix; float4x4 g_ProjectionMatrix; ``` - **1.4.2 编译着色...
特性:Direct3D9, Direct3D11v1.4, OpenGL 2.0 or 3.2v1.4, OpenGL ES 2.0 或 WebGLv1.4 渲染HLSL 或 GLSL 着色器 HLSL 字节码缓存配置渲染管线。默认实现 forward, light pre-pass 和延迟渲染基于组件的场景模型...
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 ...
总之,Shazzm Shader Editor是一个强大的工具,它为HLSL着色器的开发提供了全面的支持,通过实时预览和丰富的编辑功能,帮助开发者快速创建出富有创新性的视觉效果。无论你是游戏开发者、图形艺术家还是希望深入理解...
- **7.4 链接和使用着色器**:解释了如何将多个着色器对象链接成一个着色器程序,并如何使用该程序进行渲染。 - **7.5 清理工作**:介绍了如何释放不再使用的着色器资源。 - **7.6 查询函数**:列举了可用于查询着色...
随着 GPU 技术的发展,现代图形卡支持可编程着色器,包括顶点着色器和片段着色器(像素着色器),这使得开发者可以通过编写自定义的 GLSL (OpenGL Shading Language) 或 HLSL (High-Level Shader Language) 代码来...
- **定义**:High-Level Shading Language(HLSL)是一种高级着色语言,用于编写DirectX中的着色器程序。 - **目的**:通过HLSL可以控制3D模型表面的颜色、纹理和其他视觉效果。 **2.2 基本结构** - **变量类型**...
ShaderLab 是 Unity3D 中的一种着色器编辑器,用于编写和编辑着色器代码。Shader 敏捷开发插件是 Unity3D 中的一种插件,用于加速着色器的开发过程。通过使用 ShaderLab 和 Shader 敏捷开发插件,我们可以快速地实现...
- **Direct3D11**还支持高级着色语言(HLSL),用于编写顶点着色器和像素着色器。 **1.9 Direct3D11的几个阶段** - **顶点处理**: 负责将顶点数据转换到屏幕空间。 - **像素处理**: 负责对每个像素进行颜色和纹理...
ShaderForge是一款强大的Unity着色器构建工具,它允许开发者通过可视化界面创建自定义的着色器,无需深入学习复杂的Shader编程语言,如GLSL或HLSL。在2018到2019年期间,ShaderForge继续为Unity的这两个版本提供了...
脚本的编写遵循OGRE 3D的脚本语法,支持多种不同的着色器语言,包括Cg程序、DirectX 9 HLSL和OpenGL的GLSL。这提供了灵活性,允许开发者选择最适合项目需求的着色器语言。 合成器(Compositor)是OGRE 3D中用于图像...
介绍顶定点着色器和像素着色器的章节(包含了效果框架和新的高级着色语言的内容)对这些关键运算进行了较为集中的讨论。 本书内容深入浅出,内容广泛,可供从事3D游戏程序设计、可视化系统设计或其他图形应用程序开发...
HLSL 是一种专为 DirectX 设计的高级着色语言,用于编写顶点着色器和片段着色器。 - **顶点着色器编程**:处理输入顶点,计算其位置并进行变换。 - **几何着色器编程**:在几何体渲染过程中动态修改几何形状。 - **...