3.3应用程序

2023-05-16

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

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

3.3应用程序 的相关文章

  • ubuntu只有一种分辨率的解决方案——4K显示屏与扩展屏幕

    4K显示屏的ubuntu系统在安装NVIDIA显卡后 xff0c 只有一个分辨率为 xff1a 3840 2160 xff0c 如图所示 xff0c 该分辨率在扩展显示器的使用时 xff0c 会出现4K主屏幕分辨率很高 xff0c 而扩展显
  • 使用RTSO-9003拓展板的TX2镜像备份与恢复

    须知 TX2进入recovery模式 在给TX2通电的时候 xff0c 马上按住板子上的recovery键 xff0c 持续3秒左右 xff0c 继续保持按住recovery键并按住reset键 xff0c 便可以进入TX2的recover
  • MATLAB学习笔记

    MATLAB学习笔记 一级目录备忘录HELP文件路径MATLAB函数定义与表达MATLAB特殊变量和常量MATLAB文件读写数组数组的创建常用操作常用操作常用操作 MATLAB画图plot函数 xff1a 改变图像中线的颜色和线条形式leg
  • ubuntu16.04 boot空间不足 no space left on device

    Linux 中 boot 是存放系统启动文件的地方 xff0c 安装 ubuntu 时单独分区给 200M 足够 xff0c 但是系统内核更新后 xff0c 老的内核依然保存在 boot 分区内 xff0c 几次升级后 xff0c 就会提示
  • 什么是死锁,产生死锁的原因及必要条件

    什么是死锁 xff1f 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而造成的一种僵局 xff0c 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 因此我们举个例子来描述 xff0c 如果此
  • nvidia jetson TX2 踩坑解决记录

    最近拿着一张多年前实验室买的Jetson想刷个软路由玩 xff0c 奈何折腾了一周才把clash meta内核装好 xff0c 记录一下自己踩的坑 xff0c 整理一下以免其他玩jetson TX2的兄弟掉大坑 已经过去一周了很多都记不太清
  • 接收灵敏度

    接收灵敏度是检验基站接收机接收微弱信号的能力 xff0c 它是制约基站上行作用距离的决定性技术指标 xff0c 也是RCR STD 28协议中 xff0c 空中接口标准要求测试的技术指标之一 合理地确定接收灵敏度直接地决定了大基站射频收发信
  • 16行,使用Python制作简易版QQ自动回复机器人(windows版)

    目录 1 安装go cqhttp 2 使用go cqhttp 2 1 发送信息 2 1 1发送 你好 2 1 2 在群里 64 人 2 2获取群成员列表 2 3 实现QQ机器人 1 安装go cqhttp 点此安装go cqhttp xff
  • FPGA在线升级实战应用篇

    FPGA在线升级实战应用篇 1 摘要 项目在运营过程中可能需要根据应用需求更改固件 xff0c 或者对现有产品进行升级及在产品使用过程出现的故障进行分析 xff0c 故需要对产品进行升级维护 以往的产品出现的故障或BUG问题只能通过产品寄回
  • (xTaskNotify)- assert failed! 错误的修复

    今日在测试ESP32代码的时候 xff0c 使用xTaskNotify发生错误 xff0c 提示如下 xff1a xTaskNotify assert failed xff0c 然后系统重启 找了一下原因 xff0c 在xTaskNotif
  • kubernetes dashboard用户界面安装使用

    原文 xff1a https www toocruel net kubernetes dashboardyong hu jie mian an zhuang shi yong 1 下载kubernetes dashboard yaml文件
  • 网络通信编程学习笔记(四):在Ubuntu下创建新用户、用puTTY/VNCViewer远程登录、用ftp上传和下载、用Xming远程连接

    前言 真的用不惯VNCViewer xff0c 树莓派还是外接显示屏来的舒服 xff0c 分辨率也是1080p xff0c 只有全高清壁纸才可以慰籍学习之痛 xff01 Xming也是不如按开机键来的方便 笑哭 目录 一 用puTTY VN
  • node.js和npm离线安装

    离线安装node js和npm 1 下载官方安装包并拷贝到离线机器上 官方下载地址 xff1a https nodejs org en download 2 解压文件 xff1a tar xJf node v8 9 4 linux x64
  • Github 创建新分支

    一 clone Repository clone Github 上的Repository xff0c 如下 xff1a git clone git 64 github span class hljs preprocessor com spa
  • ARM平台基于嵌入式Linux部署ROS

    By Toradex 秦海 随着ARM平台处理能力的日益强大 xff0c 越来越多的工业智能 机器人应用在ARM平台上面实现 xff0c 在这个过程中不可避免的就涉及到将机器人应用开发框架移植到ARM平台来运行 xff0c 因此本文就着重示
  • 如何设计一款低成本的计算机载板- 第一部分

    By Toradex Peter Lischer 1 简介 在以前的博客文章中 xff0c 我们已经在一个硬件项目中使用计算机模块提出了许多讨论 xff0c 因此 xff0c 这里我们假设你已经在项目中决定采用计算机模块SoM xff0c
  • git rebase后commit id的变化

    经测试发现 xff0c 在执行完 git rebase 之后 xff0c 1 xff09 会生成的新的 commit id 2 xff09 新 commit 与旧 commit 的父节点不相同 3 xff09 旧 commit 的父节点保持
  • 嵌入式Linux下串口调试

    By Toradex秦海 1 简介 UART串口是嵌入式设备最为常用的调试和通讯接口之一 xff0c 无论是RS232还是RS422 485都有着非常广泛的应用 xff0c 因此本文就基于嵌入式Linux演示在User Space进行串口调
  • [LeetCode刷题笔记] 关于LeetCode的前言

    原创文章 转载请注册来源http blog csdn net tostq 又到了一年毕业就业季了 xff0c 三年前的校招季我逃避了 xff0c 可这一次终于还是要轮到我了 61 61 作为要准备踏入码农行业的人来说 xff0c 要准备校招
  • 关于机器视觉标定的pnp问题

    https blog csdn net cocoaqin article details 77485436 https blog csdn net cocoaqin article details 77848588利用二维码求解相机世界坐标

随机推荐

  • kvaser在linux中的应用

    本文主要讲解 xff0c kvaser如何使用简单socketcan 1 硬件 kvaser USBcan Pro 2xHS v2 2 准备系统 ubuntu 16 04 由于项目需要在程序中使用socketcan xff0c 所以需要将k
  • 编译错误-build stopped: subcommand failed. 解决方法

    make 1 Leaving directory 96 home sunhz sl8541e out target product sp8541e srvm obj u boot15 39 make Leaving directory 96
  • 如何备份jetson nano 的u盘系统?

    使用工具 xff1a Win32DiskImager 备份步骤 xff1a 1 在本地盘 xff08 C盘或D盘都行 xff0c 盘符剩余内存大于u盘系统内存就行 xff09 新建文本文档 xff0c 连后缀名字一起改成backup img
  • Security Onboard Communication-SecOC

    一 通讯加密的必要性 随着汽车电子的发展及整车功能复杂性的提高 xff0c 车载控制器数量从之前的寥寥几个增加至规模复杂的上百个 基于功能的需求 xff0c 各个控制器每时每刻需要进行大量数据的交互 xff0c 数据交互的方式也多种多样 x
  • 解决VNC远程连接树莓派,窗口显示不全的问题,亲测可行!!

    哇 xff0c 就在刚刚才百度到解决VNC远程连接树莓派 xff0c 窗口显示不全的问题 xff0c 昨晚上查了一晚上都没搞定 xff0c xff0c xff0c 首先说下问题吧 xff0c 就是用VNC远程连接树莓派后 xff0c 会出现
  • Avoid mutating a prop directly since the value will be overwritten whenever

    在vue中 父组件向子组件传值 并在子组件改变了父组件的值 就会发出警告 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定 xff1a 父级 prop 的更新会向下流动到子组件中 xff0c 但是反过来则不行 这样会防止
  • 【Linux】异步网络库dyad代码阅读

    简介 dyad是一个基于C编写的异步网络库 xff0c 非常精简 xff0c 单C文件 xff0c 仅实现TCP xff0c 很适合用来学习Linux网络编程和异步非阻塞处理 链接 Github链接 基于Dyad的echo server实现
  • 明文签署文件不可用,结果为‘NOSPLIT’

    快速记录一下在 debian上使用 apt update时遇到的一个小问题 明文签署文件不可用 xff0c 结果为 NOSPLIT xff08 您的网络需要认证吗 xff1f xff09 报错现场如下所示 xff1a span class
  • Ubuntu 16.04 安装 Gazebo

    Gazebo 是一款 3D 动态模拟器 xff0c 能够准确有效地模拟复杂室内和室外环境中的机器人群体 虽然类似于游戏引擎 xff0c Gazebo 提供了更高保真度的物理模拟 一套传感器以及用户和程序接口 Gazebo 的典型用途包括 x
  • 设计一款STM32的BootLoader

    参考文章 xff1a https blog csdn net qingtian506 article details 9128899 之前很想做一个属于STM32的BootLoader xff0c 但是想想没什么实际用处就没有下手 xff0
  • vscode之C/C++代码自动补全

    目录 准备 xff1a 步骤 xff1a 安装插件重启加载更改配置选项找到 设置 打开json配置添加配置json保存并重新打开vscode即可自动补全 准备 xff1a IDE xff1a vscode 安装就不展开啦 步骤 xff1a
  • Velodyne 16线三维激光雷达

    Velodyne 16线三维激光雷达VLP 16介绍 16线激光雷达VLP 16是Velodyne公司出品的小型的3维激光雷达 xff0c 保留了电机转速可调节的功能 实时上传周围距离和反射率的测量值 16线激光雷达VLP 16具有100米
  • [gazebo仿真]添加RealSense双目相机传感器

    下载双目相机模型和插件 xff0c 其中包含了T265 R200 D435模型 git clone https span class token operator span span class token operator span sp
  • actionlib的应用:STDR仿真器定点巡航

    关于STDR仿真器的定点巡航 xff0c ROS小课堂提供了非常详细的教程http www corvin cn 892 html xff0c 作者是用python写的巡航脚本 xff0c 下面提供一下C 43 43 版本的巡航代码 若有错误
  • ROS动态调节参数

    参考 xff1a ROS学习之路07 xff1a 编写动态重配置 dynamic reconfigure 参数的节点 https blog csdn net l1216766050 article details 79575423 ROS使
  • Linux C小项目 —— 实现文件传输

    编译运行 xff1a 文档说明 xff1a 1 整体程序设计 服务器程序是一个死循环 xff0c 处理一次连接之后不退出 xff0c 而客户端程序只处理一个连接就可以了 2 客户端程序设计 客户端程序的主要任务 xff1a a 分析用户输入
  • Linux C小项目 —— 聊天室

    多线程的聊天室 服务器端 xff1a 实现多用户群体聊天功能 xff08 人数上限可设置 xff09 xff1b 每个用户所发送的消息 xff0c 其他已连接服务器的用户均可以收到 xff1b 用户输入 bye 退出 xff0c 服务器输入
  • 3.2多纹理效果的像素着色器

    3 2 多纹理效果的像素着色器 下面是像素着色器的代码 xff0c 该代码存储于 ps txt 中 xff0c 该像素着色器根据输入的两套纹理坐标对对应的纹理贴图进行采样 xff0c 根据一定比例 Scalar 混合后输出像素颜色 全局变量
  • 【Git】国内代码托管中心码云(Gitee)

    9 国内代码托管中心码云 Gitee 9 1 简介 众所周知 xff0c GitHub 服务器在国外 xff0c 使用 GitHub 作为项目托管网站 xff0c 如果网速不好的话 xff0c 严重影响使用体验 xff0c 甚至会出现登录不
  • 3.3应用程序

    3 3 应用程序 程序中我们首先创建一个四边形 xff0c 然后使用像素着色器进行纹理混合后对其进行渲染 下面是应用程序代码 xff1a 顶点格式定义 struct CUSTOMVERTEX 定点位置坐标 float x y z 两套纹理坐