一,看本节教程前应该掌握:
(1) D3D11基础教程三之VertexShader,PixelShader,buffer
二,本节教程的程序结构:
三,纹理坐标系:
D3D11加载纹理资源的代码:
bool TexClass::Initilize(ID3D11Device* d3dDevice, WCHAR* TextureFilename)
{
HR(D3DX11CreateShaderResourceViewFromFileW(d3dDevice, TextureFilename, NULL, NULL, &mTexture, NULL));
return true;
}
D3D11设置纹理资源的代码:
d3dDeviceContext->PSSetShaderResources(0, 1, &texture);
TexClass.h (用于加载纹理)
#pragma once
#ifndef _TEX_CLASS_H
#define _TEX_CLASS_H
#include<d3d11.h>
#include"Macro.h"
#include<D3DX11.h> //创建纹理资源的API
class TexClass
{
private:
ID3D11ShaderResourceView* mTexture;
public:
TexClass();
TexClass(const TexClass&);
~TexClass();
public:
bool Initilize(ID3D11Device* d3dDevice, WCHAR* TextureFilename);
void Shutdown();
ID3D11ShaderResourceView* GetTexture();
};
#endif // !_TEX_CLASS_H
TexClass.CPP
#include"TexClass.h"
TexClass::TexClass()
{
mTexture = NULL;
}
TexClass::TexClass(const TexClass&other)
{
}
TexClass::~TexClass()
{
}
bool TexClass::Initilize(ID3D11Device* d3dDevice, WCHAR* TextureFilename)
{
HR(D3DX11CreateShaderResourceViewFromFileW(d3dDevice, TextureFilename, NULL, NULL, &mTexture, NULL));
return true;
}
void TexClass::Shutdown()
{
ReleaseCOM(mTexture);
}
ID3D11ShaderResourceView* TexClass::GetTexture()
{
return mTexture;
}
四,本节教程得注意的地方:
(1)首先修复一下前几个教程冒出来的BUG,那时我以为是VS2015的bug,也就是在CameraClass.H里无法自动识别代码莫名其妙出现错误的BUG,
我发现如何一个.H文件单独包含<XNAMATH.H>库,而不包含<WINDOWS.H>则会出现这样的错误,并且我尝试在先在CamaraClass.H里先包含<XNAMATH.H>库,然后再包含<WINDOWS.H>也会出现这样的BUG,所以我推知<XNAMATH.H>里面某些代码的编写用到了<WINDOWS.H>里的代码,
所以在CameraClass.H里先包含<WINDOWS.H>,在包含<XNAMATH.H>。
(2)能作为Shader编译文件畅游.HLSL .vs.ps .fx等格式,我试过都行,fx和HLSL格式都行,我为了不那么麻烦都是VertexShader和PixelShader都是放在MyShader.fx文件里
(3)Shader的调试方式(就是如何发现你的Shader有语法错误),以我的为粒子,右键“”MyShader.fx“” 属性-》配置属性-》项类型,然后设置“”HLSL编译器“”,在调试编译的时候,“”error X3501: 'main': entrypoint not found“”代表你没语法错误了,其它的都是语法错误,当你调试到“””error X3501: 'main': entrypoint not found“,这时候可以右键“”MyShader.fx“” 属性-》配置属性-》项类型,然后设置“”不参与生成“”.
(4) 第四点算是对第三点的补充,貌似VertexShader函数和PixelShader函数忘记 返回值(return)时编译错误也为“”error X3501: 'main': entrypoint not found“” ,比如
VertexOut VS(VertexIn ina)
{
VertexOut outa;
outa.Pos = mul(float4(ina.Pos,1.0f), World);
outa.Pos = mul(outa.Pos, View);
outa.Pos = mul(outa.Pos, Proj);
outa.Tex= ina.Tex;
}
第五点,我把辅助的参数宏放到Macro.h里,比原教程节省大量代码.
五,本节教程的程序运行的结果:
六,程序源代码链接如下
源码的链接:点击打开链接