本节教程的的结构如下:
第一,动画纹理技术
顾名思义,动画纹理就是纹理就是3D模型的纹理想动画一样会改变的,当然这里的改变是指同一张纹理中 顶点UV坐标值的改变进而造成纹理的改变,
在游戏中可用于“”流动的岩浆“,“”“流动的河流””等效果,下面上图,我用过虚幻四游戏引擎,貌似官方的水体材质的shader就用到了纹理移动技术,
如图: 虚幻四官方材质 :流动的水
下面放出的材质可视化编辑部分截图:
//移动图片UV
static float textureTranslation = 0.0f;
textureTranslation += 0.01f;
if (textureTranslation > 1.0f)
{
textureTranslation -= 1.0f;
}
看纹理动画技术是如此的强大,放出我的shader代码:
Texture2D ShaderTexture:register(t0); //纹理资源
SamplerState SampleType:register(s0); //采样方式
//VertexShader
cbuffer CBMatrix:register(b0)
{
matrix World;
matrix View;
matrix Proj;
};
cbuffer CBTexTranslation:register(b1)
{
float TexTranslation;
float3 pad;
};
struct VertexIn
{
float3 Pos:POSITION;
float2 Tex:TEXCOORD0; //多重纹理可以用其它数字
};
struct VertexOut
{
float4 Pos:SV_POSITION;
float2 Tex:TEXCOORD0;
};
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;
return outa;
}
float4 PS(VertexOut outa) : SV_Target
{
float4 color;
outa.Tex.x += TexTranslation;
outa.Tex.y += TexTranslation;
color = ShaderTexture.Sample(SampleType, outa.Tex);
return color;
}
就是如此的简单,也没太多的东西要总结的:
纹理动了,每帧渲染每个像素的纹理UV都在改变
我的源代码链接如下: