`
ruilin215
  • 浏览: 1143193 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

3.3应用程序

阅读更多

3.3应用程序

程序中我们首先创建一个四边形,然后使用像素着色器进行纹理混合后对其进行渲染。下面是应用程序代码:

/*********************顶点格式定义*****************/

struct CUSTOMVERTEX

{

//定点位置坐标

float x,y,z;

//两套纹理坐标;

float tu0, tv0;

float tu1, tv1;

};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX2)

/*********************声明变量*****************/

//顶点着色器

LPDIRECT3DPIXELSHADER9 pixelShader = 0;

//常量表

ID3DXConstantTable* pixelConstTable = 0;

//常量句柄

D3DXHANDLE ScalarHandle = 0;

D3DXHANDLE Samp0Handle = 0;

D3DXHANDLE Samp1Handle = 0;

//常量描述结构

D3DXCONSTANT_DESC Samp0Desc;

D3DXCONSTANT_DESC Samp1Desc;

//四边形顶点缓存

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, "porpcart.jpg", &quadTexture0);

D3DXCreateTextureFromFile(g_pd3dDevice, "luoqi.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);

}

//创建像素着色器

ID3DXBuffer* codeBuffer = 0;

ID3DXBuffer* errorBuffer = 0;

HRESULT hr = D3DXCompileShaderFromFile("ps.txt",

0,

0,

"PS_Main", // entry point function name

"ps_1_1",

D3DXSHADER_DEBUG,

&codeBuffer,

&errorBuffer,

&pixelConstTable);

// output any error messages

if(errorBuffer)

{

MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);

ReleaseCOM(errorBuffer);

}

if(FAILED(hr))

{

MessageBox(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0);

return false;

}

hr = g_pd3dDevice->CreatePixelShader((DWORD*)codeBuffer->GetBufferPointer(), &pixelShader);

if(FAILED(hr))

{

MessageBox(0, "CreatePixelShader - FAILED", 0, 0);

return false;

}

ReleaseCOM(codeBuffer);

ReleaseCOM(errorBuffer);

//得到各常量句柄

ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");

Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");

Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1");

//得到对着色器变量Samp0Samp0的描述

UINT count;

pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);

pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);

//设定各着色器变量为初始值

pixelConstTable->SetDefaults(g_pd3dDevice);

/********************渲染*****************/

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(153,153,153), 1.0f, 0 );

g_pd3dDevice->BeginScene();

//为着色器全局变量Scalar赋值

D3DXVECTOR4 scalar(0.5f, 0.5f, 0.0f, 1.0f);

pixelConstTable->SetVector(g_pd3dDevice, ScalarHandle, &scalar);

//设置像素着色器

g_pd3dDevice->SetPixelShader(pixelShader);

//设置定点格式、绑定数据流

g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

g_pd3dDevice->SetStreamSource(0, quadVB, 0, sizeof(CUSTOMVERTEX));

//设置第一、二层纹理

g_pd3dDevice->SetTexture(Samp0Desc.RegisterIndex, quadTexture0);

g_pd3dDevice->SetTexture(Samp1Desc.RegisterIndex, quadTexture1);

//绘制图形

g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

g_pd3dDevice->EndScene();

g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

程序中像素着色器的使用和之前顶点着色器的使用无二,只是设置着色器中纹理采样器变量Samp0Samp1和设定着色器其他变量稍有不同:

1. 首先通过变量名称得到变量句柄:

Tex0Handle = pixelConstTable->GetConstantByName(0, " Samp0");

Tex1Handle = pixelConstTable->GetConstantByName(0, " Samp1");

2. 然后通过句柄得到对变量的描述:

UINT count;

pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);

pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);

3.最后通过SetTexture配合所得到的描述信息设置纹理:

g_pd3dDevice->SetTexture(Samp0Desc.RegisterIndex, quadTexture0);

g_pd3dDevice->SetTexture(Samp1Desc.RegisterIndex, quadTexture1);

编译运行程序,运行效果如图3.2,这里我们将颜色混合比例设置为0.5,如果读者在渲染过程中不断变换对着色器变量Scalar的赋值,你将会得到一个混合度不断变换的多纹理效果。

D3DXVECTOR4 scalar(0.5f, 0.5f, 0.0f, 1.0f); //读者可以尝试改变混合采用的比例值

pixelConstTable->SetVector(g_pd3dDevice, ScalarHandle, &scalar);

纹理一

纹理二

混合后纹理三

3.2

分享到:
评论

相关推荐

    ext 3.3 中文 chm

    9. 性能优化(Performance Optimization):提供了一些提高EXT 3.3应用程序性能的技巧和策略。 10. API参考(API Reference):完整的EXT 3.3类库API文档,供开发者查询具体类和方法的使用。 这个CHM文件对于学习和...

    EAC3.3升级程序

    《EAC3.3升级程序详解与应用指南》 EAC3.3升级程序是针对电子申请客户端管理系统(Electronic Application Client,简称EAC)的一次重要更新,旨在提升系统的功能性能,优化用户体验,并确保系统的安全性和稳定性。...

    SqlDbxPro3.3

    SqlDbxU.exe和SqlDbx.exe则是程序的执行文件,用户可以直接运行来启动SqlDbxPro3.3应用程序。 总的来说,SqlDbxPro3.3作为一个轻量级的数据库管理工具,它的便携性和强大的功能使得数据库操作变得更加灵活和高效,...

    MFC Windows程序设计(第二版) 源代码 任哲编著 [评价可免费]

     3.3 应用程序的文档/视图结构  3.4 文档类CDocument的派生类  3.5 视图类CView的派生类  3.6 窗口框架类CFrameWnd的派生类  3.7 文档模板类CDocTemplate  3.8 应用程序类的派生类  3.9 MFC文档/视图应用程序...

    基于Java TV API的电子节目指南设计.pdf

    3.3应用程序生命周期机制 Java TV API提供了应用程序生命周期机制,包括应用程序的安装、启动、执行和卸载等操作。这些操作都是基于Java TV API的面向应用任务的业务信息访问特性实现的。 四、结论 本文总结了...

    CCS3.3的驱动配置及烧写向导

    首先,安装基础版CCS3.3.38,随后应用CCS_v3.3_SR11_81.exe补丁,接着依次安装F2823x_RevA_CSP.exe、setup_C28XFPU_CSP_v3.3.1207.exe以及C2000CodeGenerationTools5.0.0Beta3.exe补丁,确保遵循正确的路径与覆盖...

    DirectX修复工具 V3.3增强 绿色版

    本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还...

    网络商城需求分析免费下载

    网上购物, ASP,数据库,购物篮 目录 一 、前言 4 1.1本课题的现状及发展趋势 5 1.2课题的内容及目标 7 ...3.3应用程序的安全性 27 3.4用户的认证管理 28 3.5电子商务及其存在的问题 29 四、系统测试 33 五、结束语 34

    DSP CCS3.3 文件读写操作

    本文将深入探讨在CCS 3.3版本中如何进行文件读写操作,并结合实际应用讲解相关知识点。 一、CCS 3.3简介 Code Composer Studio 3.3是TI公司推出的一款针对TMS320C系列DSP的开发工具,它集成了编辑器、编译器、链接...

    追格微信小程序应用商店源码 v3.3.zip

    追格微信小程序应用商店是追格科技开发的一款免费开源小程序商店系统,支持...追格微信小程序应用商店源码 v3.3 更新日志 1、细节修复; 2、其他 追格微信小程序应用商店前台截图 追格微信小程序应用商店后台截图

    实验3.1_b+3.3参考程序.zip

    其次,3.3.c 文件可能涉及到的是一种不同的主题或者B+树的扩展应用。由于没有明确的标签指示,我们可以推测这可能是B+树的另一个练习,比如处理磁盘I/O、优化查询性能,或者实现多线程环境下的并发控制。它也可能是...

    Visual LISP应用程序开发指南——利用AP-API开发高效应用程序.pdf

    第7章 生成和配置应用程序 88 7.1 创建工程 89 7.2 创建应用程序 91 7.3 加载应用程序 94 7.4 安装应用程序 96 7.5 配置应用程序 98 附录 ap-api参考 99 a.1 ap-api实用函数 100 a.2 ap-api activex实用函数...

    第3章3.3ARM指令及应用程序设计数据处理指令.pdf

    第3章3.3ARM指令及应用程序设计数据处理指令.pdf

    追格微信小程序应用商店源码 v3.3

    追格微信小程序应用商店是追格科技开发的一款免费开源小程序商店系统,支持小程序分类呈现、精品小程序推荐、开发者自主提交自己的小程序信息等...追格微信小程序应用商店源码 v3.3更新版本说明:1、细节修复;2、其他

    【CCS_V3.3】for【DSP】编程应用笔记

    通过 CCS_V3.3,开发者可以快速地开发、测试和优化 DSP 应用程序。 DSP 编程基础知识 DSP 编程是指使用数字信号处理器来实现数字信号处理的技术。数字信号处理是指对数字信号进行处理和分析的过程,包括滤波、变换...

    delphi 组件 EHlib3.3

    EHlib3.3是一款专为Delphi开发者设计的强大组件库,它提供了一系列的实用控件和工具,帮助开发者在开发过程中提高效率,增强应用程序的功能。这个组件库广泛支持多种Delphi版本,包括D7(Delphi 7)和D2009等,这...

    CCS3.3读取bmp图像进行处理

    本项目“CCS3.3读取bmp图像进行处理”显然是一个利用CCS3.3版本实现的,针对bmp图像的读取和处理的应用实例。以下将详细介绍该知识点及其相关背景。 1. **BMP图像格式** BMP(Bitmap)是Windows操作系统中的一种...

Global site tag (gtag.js) - Google Analytics