`
javababy1
  • 浏览: 1219800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

1.4怎么用HLSL着色器

 
阅读更多

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 着色器效果

分享到:
评论

相关推荐

    HLSL基础教程(完整篇)

    #### 1.4 怎么用HLSL着色器 应用HLSL着色器包括以下步骤: 1. **声明全局变量**:在C++代码中,你需要声明与HLSL着色器中定义的全局变量相对应的变量,这样可以在CPU和GPU之间交换数据。 2. **编译着色器**:使用...

    HLSL初级教程.pdf

    **1.4 怎么用HLSL着色器** 使用HLSL着色器涉及到几个步骤:加载着色器代码、编译着色器、创建着色器对象以及设置着色器参数。例如,在C++应用程序中,可以使用`ID3D11Device::CreateVertexShader`和`ID3D11Device::...

    HLSL(微软高级着色语言)初级教程

    ##### 1.4 怎么用HLSL着色器 在DirectX应用程序中使用HLSL着色器,首先需要创建着色器对象并编译着色器代码。接着,将编译后的着色器对象绑定到渲染管线中相应的阶段(如顶点着色器或像素着色器)。具体步骤如下: ...

    HLSL 入門教學

    ##### 1.4 如何使用HLSL着色器? - **1.4.1 声明全局变量**:在着色器中声明全局变量,例如: ```hls float4x4 g_WorldMatrix; float4x4 g_ViewMatrix; float4x4 g_ProjectionMatrix; ``` - **1.4.2 编译着色...

    游戏引擎Urho3D.zip

    特性:Direct3D9, Direct3D11v1.4, OpenGL 2.0 or 3.2v1.4, OpenGL ES 2.0 或 WebGLv1.4 渲染HLSL 或 GLSL 着色器 HLSL 字节码缓存配置渲染管线。默认实现 forward, light pre-pass 和延迟渲染基于组件的场景模型...

    Introduction to 3D Game Programming with DirectX 9.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 ...

    Shazzm Shader Editor

    总之,Shazzm Shader Editor是一个强大的工具,它为HLSL着色器的开发提供了全面的支持,通过实时预览和丰富的编辑功能,帮助开发者快速创建出富有创新性的视觉效果。无论你是游戏开发者、图形艺术家还是希望深入理解...

    OpenGL Shading Language, Second Edition

    - **7.4 链接和使用着色器**:解释了如何将多个着色器对象链接成一个着色器程序,并如何使用该程序进行渲染。 - **7.5 清理工作**:介绍了如何释放不再使用的着色器资源。 - **7.6 查询函数**:列举了可用于查询着色...

    非真实感渲染技术案例

    随着 GPU 技术的发展,现代图形卡支持可编程着色器,包括顶点着色器和片段着色器(像素着色器),这使得开发者可以通过编写自定义的 GLSL (OpenGL Shading Language) 或 HLSL (High-Level Shader Language) 代码来...

    基于Unity3D的独立游戏卡通Shader的研究与实现.docx

    ShaderLab 是 Unity3D 中的一种着色器编辑器,用于编写和编辑着色器代码。Shader 敏捷开发插件是 Unity3D 中的一种插件,用于加速着色器的开发过程。通过使用 ShaderLab 和 Shader 敏捷开发插件,我们可以快速地实现...

    DX11游戏编程入门(中文版)

    - **Direct3D11**还支持高级着色语言(HLSL),用于编写顶点着色器和像素着色器。 **1.9 Direct3D11的几个阶段** - **顶点处理**: 负责将顶点数据转换到屏幕空间。 - **像素处理**: 负责对每个像素进行颜色和纹理...

    OGRE 3D v1.4.0中文手册.pdf

    脚本的编写遵循OGRE 3D的脚本语法,支持多种不同的着色器语言,包括Cg程序、DirectX 9 HLSL和OpenGL的GLSL。这提供了灵活性,允许开发者选择最适合项目需求的着色器语言。 合成器(Compositor)是OGRE 3D中用于图像...

    DirectX9 3D游戏设计入门 英文版+中文版+源代码

    介绍顶定点着色器和像素着色器的章节(包含了效果框架和新的高级着色语言的内容)对这些关键运算进行了较为集中的讨论。 本书内容深入浅出,内容广泛,可供从事3D游戏程序设计、可视化系统设计或其他图形应用程序开发...

    GPU-based Techniques for Global Illumination Effects

    HLSL 是一种专为 DirectX 设计的高级着色语言,用于编写顶点着色器和片段着色器。 - **顶点着色器编程**:处理输入顶点,计算其位置并进行变换。 - **几何着色器编程**:在几何体渲染过程中动态修改几何形状。 - **...

Global site tag (gtag.js) - Google Analytics