4.2用Effect实现多纹理化效果

2023-05-16

4.2Effect实现多纹理化效果

       前面我们介绍了一个使用像素着色器实现的多纹理化,这里用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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4.2用Effect实现多纹理化效果 的相关文章

  • github cli 创建远程仓库并推送到github

    以下操作基于macOS xff0c 其他系统安装请参阅官方文档cli cli GitHub s official command line tool 1 安装github cli brew span class token function
  • 阿里云生活物联网删除测试设备

    阿里云生活物联网平台 https living aliyun com 的测试设备 xff0c 在生活物联网平台页面是无法进行删除的 xff0c 生活物联网平台的设备列表只能显示量产设备 如果要删除测试设备 xff0c 必须在物联网平台 ht
  • STM32CubeMX学习教程之四:定时器中断

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX TIM1 Interrupt 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4
  • 算法——贝塞尔(Bézier)曲线拟合

    文章目录 1 基本概念 1 1 从熟悉的地方入手 1 2 贝塞尔曲线拟合原理 转载 2 公式和物理意义 2 0 阶数和伯恩斯坦多项式等 2 0 1 阶数 2 0 2 伯恩斯坦多项式 2 0 3 杨辉三角和二项式系数 2 1 一阶 次贝塞尔公
  • STM32CubeMX学习教程之五:PWM实现呼吸灯效果

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX PWM Output 软件 xff1a STM32CubeMX V4 25 0 System Workbench V2 4 固件库版
  • STM32CubeMX学习教程之十:硬件I2C读写AT24C02

    完整源码下载 xff1a https github com simonliu009 STM32CubeMX hardware I2C AT24C02 网上有流传已久一种说法 xff0c 就是STM的I2C有bug xff0c 不好用 确实很
  • Visual Studio Code 的 includePath 全局设置

    这几天折腾使用Visual Studio Code 编写 ESP8266 non os 代码 xff0c 基本设置都没问题 xff0c 但是就是自动补全折腾很久没弄好 在折腾了一圈插件之后 xff08 包括Auto Import C 43
  • 使用.gitignore忽略文件或者文件夹及其失效解决方法

    git如果需要忽略某个文件夹 xff0c 可以在初始化之后 xff0c 在仓库根目录下创建一个 gitignore文件 xff0c 添加需要忽略的文件和文件夹即可 我们也不需要从头写 gitignore文件 xff0c GitHub已经为我
  • python源代码文件加密

    由于python设计的初衷是开源的 xff0c 因此py文件是可以直接看到源码的 但开发商业软件 xff0c 代码加密保护就比较重要了 python编译后程序 pyc文件是py文件经过编译后生成的二进制文件 xff0c 因此可以发布pyc文
  • gnu binutils

    The GNU Binutils are a collection of binary tools The main ones are ld the GNU linker as the GNU assembler But they also
  • android wakelock

    1 android休眠控制锁 powermanager acquir 获取控制锁 powermanager release 释放控制锁 2 在powerManagerService中 xff0c 有检测当前framework层中的wakel
  • 产品经理常用术语

    产品经理常用术语 长尾理论 网络时代兴起的一种新理论 xff0c 由于成本和效率的因素 xff0c 当商品储存流通展示的场地和渠道足够宽广 xff0c 商品生产成本急剧下降以至于个人都可以进行生产 xff0c 并且商品的销售成本急剧降低时
  • 传统CD车机面板操作说明

    转自http bbs hifidiy net thread 675597 1 1 html 一般CD车机带USB SD卡的面板操作说明 1 1 控制面板外观图 2 0 基本 共同 功能操作说明 2 1 开启和关闭电源 静音开关 按 钮为开启
  • 汽车总线系统通信协议

    天合汽车零部件 xff08 上海 xff09 有限公司 上海交通大学区域光纤通信网与新型光通信系统国家重点实验室 xff08 上网时间 xff1a 2006 11 xff09 摘要 xff1a 本文主要针对汽车电子控制系统和车载多媒体系统
  • 算法——连续性后处理(把26邻域连续的变成6邻域连续的)

    文章目录 1 概念 1 1 6邻域连续 1 2 18邻域连续 1 3 26邻域连续 1 4 总结 2 目标 3 严格一点的 3 1 原理描述 3 1 1 18邻域连续补充 3 1 2 26邻域连续补充 3 2 代码实现 C 4 宽松一点的
  • RedHat Linux下安装JDK1.7报错Permission denied

    在RedHat Linux5 中安装JDK1 7时 xff0c 当我解压jdk xff0c 并且配置好了环境变量 xff0c 测试的时候 xff0c 报以下错误 root 64 jingfeng01 java version Error d
  • 几种压缩算法的压缩和速度比较

    Quick Benchmark Gzip vs Bzip2 vs LZMA vs XZ vs LZ4 vs LZO EDIT Add zstd Contents hide 1 Selected archives2 Test conditio
  • DDR低功耗模式

    DDR规格 xff1a DDR工作状态图 xff1a DDR 刷新描述 xff1a 电特性 xff1a 工作模式简介 xff1a 1 1 自刷新模式 xff08 Self Refresh Mode xff09 DDR4 SDRAM中自刷新超
  • 嵌入式Linux的低功耗策略

    引 言 由于Linux系统具备嵌入式操作系统需要的很多特色 xff0c 如适应于多种CPU和多种硬件平台 性能稳定 可裁剪性很好 源码开放 研发和使用简单等 现在 xff0c 基于Linux应用的嵌入式设备日益增多 xff0c Linux正
  • libevent实现的HTTP Server

    在使用C语言编码时 有时候需要实现一个HTTP接口 我们可以选择使用libevent库来实现 以下代码演示了使用libevent 并同时支持多线程处理HTTP的请求 头文件 引入的头文件 span class token macro pro

随机推荐

  • Python爬虫完整案例 - 爬取百度百科词条信息

    概述 一个完整的爬虫 xff0c 一般由以下5个组件构成 1 URL管理器 负责维护待爬取URL队列 和已爬取URL队列 xff0c 必须拥有去重功能 2 HTML下载器 负责根据调度器从URL管理器中取出的url xff0c 下载html
  • android apk 签名(平台和普通签名)

    因为做了太多的终端项目 xff0c 客户总会有自己的apk提供 xff0c 这时候各种签名问题就来了 xff0c 最近整理了一下相关知识 xff0c 分享给大家 签名的用处 xff1a 1 应用程序升级 xff1a 如果你希望用户无缝升级到
  • scikit-learn介绍

    在机器学习和数据挖掘的应用中 xff0c scikit learn是一个功能强大的python包 在数据量不是过大的情况下 xff0c 可以解决大部分问题 学习使用scikit learn的过程中 xff0c 我自己也在补充着机器学习和数据
  • 【JUC】CompletableFuture超时处理 配置线程池

    CompletableFuture 简介使用方法代码 简介 xff1a 项目中一个统计的业务场景 xff0c 使用原生的CompletableFuture异步多个任务查询mysql数据 xff0c 少量请求无问题 xff0c 但是测试过程中
  • 使用mysql命令行导出导入MariaDB库数据中文乱码问题解决

    问题 xff1a 到MariaDB bin目录下 xff0c 使用shit 43 右键打开powershell xff0c 执行mysqldump命令导出ems2库数据为sql文件 xff0c 命令中设置字符集为utf8 xff0c 则生成
  • :app:checkDebugDuplicateClasses Execute taskAction

    今天把AS从2 3 3升为3 4 2后 xff0c 导入项后发现报这个 app checkDebugDuplicateClasses的错 xff1a 然后查看了日志 xff0c 真是长篇大论 xff0c 一头雾水 org gradle ap
  • 3D Slicer/ITK-SNAP常见使用

    不是医生 是程序员 使用侧重点不一定相同 文章目录 1 3D Slicer使用 1 0 常见快捷键 1 1 三视图联动 1 2 在model视图查看三视图 1 3 最大化某个视图 1 4 改segment的标号 label 1 5 常见插件
  • 某些.csh .sh脚本无法在shell下执行的问题解决

    背景 最近换了一个环境 xff0c 登录后执行一个环境相关配置的 csh脚本时发现某些执行字段无法识别 xff0c 这种一般就是不同bash支持的脚本语言的差异问题 解决 查询当前shell的bash xff1a echo SHELL 当前
  • Linux 权能综述

    为了执行权限检查 xff0c 传统的 UNIX 实现区分两种类型的进程 xff1a 特权进程 xff08 其有效用户 ID 为0 xff0c 称为超级用户或 root xff09 xff0c 和非特权用户 xff08 其有效 UID 非0
  • EGL Context 创建

    继续 EGL context 创建的分析 eglInitialize 来看 EGL10 eglInitialize 的实现 com google android gles jni EGLImpl 中 xff0c 这个方法的实现如下 xff1
  • 【嵌入式】如何使用JLINK RTT打印log日志

    没有串口的情况下可以使用JLINK的RTT即 Real Time Transfer功能 RTT的工作原理大致就是在内存里面创建一个RTT控制块RTT Control Block xff0c 即SEGGER RTT CB结构体 这个结构体里面
  • Android R Settings搜索框功能流程

    Settings 搜索是调用的 SettingsIntelligence 应用的 SearchActivity xff0c 路径 xff1a android packages apps SettingsIntelligence 流程图如下
  • Android R 系统编译时 Lint 工具检查问题记录

    Android R上面对于系统api的修改变更有了新的检查方式 xff0c 对于代码静态检查变得更严格了 xff0c 代码中类型或是参数有些必须要添加 64 NonNull 等注释 xff0c 否则编译不过 编译报错日志大致如下 See t
  • Android 长时间待机后系统概率性无声

    之前一个高通平台项目出现这种问题 xff0c 查看log xff0c 发现出现异常的时候 xff0c 系统 audioserver 挂了 xff0c 导致 audioserver 挂了log 02 24 10 12 46 724 1041
  • 安卓更改app中状态栏和底部手机导航栏背景颜色

    相应的属性 xff1a 在res目录下的values文件夹中有一个styles xml文件 xff0c 它定义了一些安卓应用的布局样式 xff0c 如是否显示默认的actionbar xff1a span class token opera
  • 3.2多纹理效果的像素着色器

    3 2 多纹理效果的像素着色器 下面是像素着色器的代码 xff0c 该代码存储于 ps txt 中 xff0c 该像素着色器根据输入的两套纹理坐标对对应的纹理贴图进行采样 xff0c 根据一定比例 Scalar 混合后输出像素颜色 全局变量
  • 3.3应用程序

    3 3 应用程序 程序中我们首先创建一个四边形 xff0c 然后使用像素着色器进行纹理混合后对其进行渲染 下面是应用程序代码 xff1a 顶点格式定义 struct CUSTOMVERTEX 定点位置坐标 float x y z 两套纹理坐
  • ITK——5. 利用ITK自身的多线程加速filter计算

    文章目录 1 ITK多线程简介 1 1 平台多线程 1 1 1 基本内容 1 1 2 Intel的TBB 1 2 典型例子 执行原理 1 3 5 X版本之后的变动 1 4 ITK多线程整体认识 1 4 1 基本内容 1 4 2 过滤器级别的
  • 4.HLSL Effect(效果框架)

    4 HLSL Effect xff08 效果框架 xff09 进行到这里 xff0c 读者可能会觉得使用着色器多少有些繁琐 xff0c Effect xff08 效果框架 xff09 被提出以解决这些问题 作为一种方法 xff0c Effe
  • 4.2用Effect实现多纹理化效果

    4 2 用 Effect 实现多纹理化效果 前面我们介绍了一个使用像素着色器实现的多纹理化 xff0c 这里用 Effect 框架重新给于实现 xff0c 读者可以比较两者之间的异同 xff0c 体会 Effect 框架给我们带来了哪些方面