4.2用Effect实现多纹理化效果
前面我们介绍了一个使用像素着色器实现的多纹理化,这里用Effect框架重新给于实现,读者可以比较两者之间的异同,体会Effect框架给我们带来了哪些方面的改善。
4.2.1着色器
下面是着色器代码,该代码存储于Effect.txt中,代码中包含了一个顶点着色器和一个像素着色器和一个Effect效果框架。
//---------------------------------------------
// 顶点着色器
//---------------------------------------------
matrix WVPMatrix;
struct VS_INPUT
{
vector position : POSITION;
float2 uvCoords0 : TEXCOORD0;
float2 uvCoords1 : TEXCOORD1;
};
struct VS_OUTPUT
{
vector position : POSITION;
float2 uvCoords0 : TEXCOORD0;
float2 uvCoords1 : TEXCOORD1;
};
VS_OUTPUT VS_Main(VS_INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.position = mul(input.position, WVPMatrix);
output.uvCoords0 = input.uvCoords0;
output.uvCoords1 = input.uvCoords1;
return output;
}
//---------------------------------------------
// 像素着色器
//---------------------------------------------
vector Scalar;
texture Tex0;
texture Tex1;
sampler Samp0 =
sampler_state
{
Texture = <Tex0>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler Samp1 =
sampler_state
{
Texture = <Tex1>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
struct PS_INPUT
{
float2 uvCoords0 : TEXCOORD0;
float2 uvCoords1 : TEXCOORD1;
};
struct PS_OUTPUT
{
float4 Color : COLOR0;
};
PS_OUTPUT PS_Main(PS_INPUT input)
{
PS_OUTPUT output = (PS_OUTPUT)0;
output.Color = tex2D(Samp0, input.uvCoords0)*Scalar.x + tex2D(Samp1, input.uvCoords1)*Scalar.y;
return output;
}
//---------------------------------------------
// 效果框架
//---------------------------------------------
technique T0
{
pass P0
{
vertexShader = compile vs_1_1 VS_Main();
pixelShader = compile ps_1_1 PS_Main();
}
}
注意程序中是如何使用效果框架将顶点着色器和像素着色器组织起来的:
pass P0
{
//着色器类型 版本号 入口函数名称
vertexShader = compile vs_1_1 VS_Main();
pixelShader = compile ps_1_1 PS_Main();
}
也可以直接将着色代码写在pass过程中,相关用法请读者参看DirectX文档:
pass P0
{
//这里书写着色器代码
…
}
有了之前的基础,着色器代码读者应该很容易理解,下面具体介绍如何在应用程序中使用Effect。
4.2.2应用程序
…
/*********************顶点格式定义*****************/
struct CUSTOMVERTEX
{
//定点位置坐标
float x,y,z;
//两套纹理坐标;
float tu0, tv0;
float tu1, tv1;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX2)
…
/*********************声明变量*****************/
//Effect效果指针
ID3DXEffect *g_pEffect = 0;
//常量句柄
D3DXHANDLE WVPMatrixHandle = 0;
D3DXHANDLE ScalarHandle = 0;
D3DXHANDLE Tex0Handle = 0;
D3DXHANDLE Tex1Handle = 0;
D3DXHANDLE TechHandle = 0;
//四边形顶点缓存
LPDIRECT3DVERTEXBUFFER9 quadVB = NULL;
//两个纹理
LPDIRECT3DTEXTURE9 quadTexture0 = NULL;
LPDIRECT3DTEXTURE9 quadTexture1 = NULL;
…
/********************初始化应用程序*****************/
//定义四边顶点模型
CUSTOMVERTEX quad[] =
// x y z tu0 tv0 tu1 tv1
{{-3.0f, -3.0f, 10.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -3.0f, 3.0f, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f},
{ 3.0f, -3.0f, 10.0f, 1.0f, 1.0f, 1.0f, 1.0f},
{ 3.0f, 3.0f, 10.0f, 1.0f, 0.0f, 1.0f, 0.0f}};
//设置顶点缓存
void *ptr = NULL;
g_pd3dDevice->CreateVertexBuffer(sizeof(quad),
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_MANAGED,
&quadVB,
NULL);
quadVB->Lock(0, 0, (void**)&ptr, 0);
memcpy((void*)ptr, (void*)quad, sizeof(quad));
quadVB->Unlock();
//创建纹理
D3DXCreateTextureFromFile(g_pd3dDevice, "chopper.bmp", &quadTexture0);
D3DXCreateTextureFromFile(g_pd3dDevice, "Bleach.jpg", &quadTexture1);
//检测像素着色器是否被支持
D3DCAPS9 caps;
g_pd3dDevice->GetDeviceCaps(&caps);
if(caps.PixelShaderVersion < D3DPS_VERSION(1, 1))
{
MessageBox(0, "NotSupport Pixel Shader - FAILED", 0, 0);
exit(0);
}
//创建Effect效果
ID3DXBuffer* errorBuffer = 0;
HRESULT hr = D3DXCreateEffectFromFile(g_pd3dDevice,
"Effect.txt",
0,
0,
D3DXSHADER_DEBUG,
0,
&g_pEffect,
&errorBuffer);
// output any error messages
if(errorBuffer)
{
MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
ReleaseCOM(errorBuffer);
exit(0);
}
if(FAILED(hr))
{
MessageBox(0, "D3DXCreateEffectFromFile() - FAILED", 0, 0);
return false;
}
//得到各常量句柄
WVPMatrixHandle = g_pEffect->GetParameterByName(0, "WVPMatrix");
ScalarHandle = g_pEffect->GetParameterByName(0, "Scalar");
Tex0Handle = g_pEffect->GetParameterByName(0, "Tex0");
Tex1Handle = g_pEffect->GetParameterByName(0, "Tex1");
//得到技术technique T0的句柄
TechHandle = g_pEffect->GetTechniqueByName("T0");
//设置纹理,注意这里设置纹理的方式比之前像素着色器简便很多
g_pEffect->SetTexture(Tex0Handle, quadTexture0);
g_pEffect->SetTexture(Tex1Handle, quadTexture1);
…
/********************渲染*****************/
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(153,153,153), 1.0f, 0 );
g_pd3dDevice->BeginScene();
//为着色器变量WVPMatrix赋值
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;
g_pEffect->SetMatrix(WVPMatrixHandle, &matWVP);
//为着色器全局变量Scalar赋值
D3DXVECTOR4 scalar(0.5f, 0.5f, 0.0f, 1.0f);
g_pEffect->SetVector(ScalarHandle, &scalar);
//设置定点格式、绑定数据流
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->SetStreamSource(0, quadVB, 0, sizeof(CUSTOMVERTEX));
//注意下面使用effect框架进行渲染的方法
//设置要使用的技术
g_pEffect->SetTechnique(TechHandle);
//遍历技术中包含的所有过程进行多次渲染
UINT numPasses = 0;
g_pEffect->Begin(&numPasses, 0);
for(UINT i = 0; i<numPasses; ++i)
{
//开始过程
g_pEffect->BeginPass(i);
//绘制图形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
//结束过程
g_pEffect->EndPass();
}
//结束使用技术
g_pEffect->End();
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
…
以上是应用程序中使用Effect框架的代码,可以看到Effect在着色器加载、着色器变量赋值、顶点着色器和像素着色器配合使用等方面做出了简化,这里只是个简单的例子,当读者深入学习Effect的时候,会了解到更多Effect框架为着色器编程提供的方便。
编译运行程序,运行效果如图4.1所示,这和第三章使用像素着色器实现的多纹理化效果是一样的。
纹理一
纹理二
混合后纹理三
图4.1
分享到:
相关推荐
目录 前言 1.HLSL入门 1.1什么是着色器 1.2什么是HLSL 1.3怎么写HLSL着色器 1.4怎么用HLSL着色器 2.顶点着色器 2.1可编程数据流模型 2.2顶点声明 2.3用顶点着色器实现渐变动画 ...4.2用Effect实现多纹理化效果 结语
android kenBurnsView使用,实现Ken Burns effect图片展示效果的效果android控件
HTML-TYPE-EFFECT实现网页上创建打字效果。
This disclaimer applies to all draft specifications and final specifications adopted by the ...interpretation or effect of this Specification on any matters discussed in this Specification.
粒子系统 [插件] Environment Weather Effect 2.0_环境天气效果_风沙雨雪,链接:https://pan.baidu.com/s/18SRT-TbQqC6J6oiEUMqumg,购买之前请先确认链接可用,文件里是链接密码。资源仅供大家学习交流,下载的...
html5 effect模拟实现的图片光影效果,好像这效果最初来源于京东,当鼠标滑向图片的时候,图片上有光影快速划过,纯HTML5技术实现,单看效果的话,和Flash产生的效果很像,不过看代码的话,那就天壤之别了。
LCD 分屏 切屏 Tearing effect Hx8357
论述如何充分发挥GPU的功能,用Direct3D实现SlideShow中的effect和transition。利用Direct3D中的固定功能流水线能实现多种transition和一些简单的effect,如扫描、渐隐渐现及图像旋转等。借助Direct3D中的可编程流水...
unity3d 游戏插件 Sci-fi Spaceship Effect Pack 宇宙船射击效果;
韵乐X3X5软件(Audio Effect Controller)韵乐X3X5效果器调试软件
x5效果器原厂调试软件,首次使用需要搜索,这可能会花费几秒钟去搜索设备和下载数据。连接不上请检查网络设置,查看连接目标IP地址和连接目标端口号。功能:设置音量限制,音乐启始音量及最大音量,话筒启始及最大...
用来展示通过OpenCv实现的perspective effect 透视效果
unity自带的image effect中的一个摄像机特效,针对全屏幕渲染的。场景中的GameObject的材质shader通过alpha通道进行控制光晕,也就是说当alpha变成0那么将是原来的颜色。
29.1 使用纹理贴图实现海浪效果 29.2 实时生成海浪效果 29.3 小结 第30章 柔性物体模拟 30.1 柔性物体模拟介绍 30.2 粒子系统和弹簧结构 30.3 定义并实现cflutterflag类 30.4 示例程序的具体实现 30.5 小结 第31章 ...
day30-Auto Text Effect(自动文本吐字效果)
演示使用凹凸纹理映射实现水下视觉效果模拟。 2、BumpWaves 演示使用凹凸纹理映射实现水波效果模拟。 第34章 短毛发实时绘制 Fur 演示使用纹理映射实现短毛发的实时绘制。 第35章 体积雾 VolumeFog 演示使用ASM...
EFFECT
K7效果器调试软件中文版K7 Audio Effect Controlle
AudioEffect 1.22单文件绿色版(增加音频效果工具)lrxy作品