前言
这篇文章开始不再以教程中的框架代码为示例,因为我发现本身在学习 DirectX 基本语法当中,多写几遍能加深印象是其一,其二是对那些 API 理解并非太深刻的时候实现较为复杂的内容的时候会导致难以去 Debug ,同时也丧失了基本的学习效果。
前置内容
我们使用我们之前做过的简单的三角形那个例子,将其代码拷贝过来(再写一遍最好,虽然说写重复代码比较愚蠢,但是蠢有蠢的好处),用来实现这篇文章要实现的内容。
我们这篇文章将学习纹理的用法,之后在我们之前的纯色三角形上贴一张好看图片
教程地址
学习记录
纹理(Texture)的概念我想就不用介绍了,在 OpenGL 中我们使用过很多次。这篇文章主要是介绍 DX 中纹理的加载操作。首先我们修改着色器程序:
1 | // file : triangleVertexShader.hlsl |
我们在顶点着色器中定义了结构体用于传递数据,结构体包括 position
和 texcoord
数据(即 UV
坐标)。
在像素着色器中,我们定义了 Texture2D
变量和 SamplerState
采样器变量,用于从纹理上采样颜色。
1 | // file: trianglePixelShader.hlsl |
而在 DX 代码中,我们首先修改 Vertex
结构体和顶点坐标集合,现在 Vertex
结构体应当包含一个 UV 坐标:
1 | struct Vertex { |
现在创建一个采样器描述并为他赋值:
1 | D3D11_SAMPLER_DESC samplerDesc; |
关于这个结构体的各个属性可以看 MSDN 。(我懒)
使用采样器描述创建一个指针对象:
1 | ID3D11SamplerState *pSamplerState = nullptr; |
从文件创建一个渲染视图:
1 | ID3D11ShaderResourceView *pShaderResourceView; |
为立即上下文对象赋值渲染视图和采样器:
1 | pImmediateContext->PSSetShaderResources(0, 1, &pShaderResourceView); |
这时,我们还需要修改布局描述:
1 | D3D11_INPUT_ELEMENT_DESC layout[] = { |
在 POSITION
的基础上我们需要添加一个 TEXCOORD
,其他的代码都不需要修改,现在点击运行,就可以看到我们的三角形了。