Direct3D颜色

news2024/11/25 3:07:42

在Direct3D中颜色用RGB三元组来表示,RGB数据可用俩种不同的结构来保存,第一种是D3DCOLOR,它实际上与DWORD类型完全相同,共有32位,D3DCOLOR类型种的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。

由于每种颜色分量占一个字节,所以每个分量的亮度值范围在[0,255]区间内,接近0的值表示低亮度,接近255的值表示高亮度。

可以使用D3DCOLOR_XRGBD3DCOLOR_ARGB来为D3DCOLOR赋值,二者的区别是前者不接收Alpha参数,其实前者试讲Alpha分量设为0xff(255)。

#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

D3DCOLOR brightRed = D3DCOLOR_ARGB(255,155,0,0);

在Direct3D中存储颜色的另一种结构是D3DCOLORVALUE,在该结构中我们用单精度浮点数来度量每个颜色分量的亮度值,亮度值的取值范围为0~1(0表示没有亮度,1表示亮度最大)

typedef struct D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;

我们也可以用结构D3DXCOLOR替代D3DCOLORVALUE,前者不但包含了后者相同的数据成员,而且还提供了一组有用的构造函数和重载运算符,为颜色的运算提供了便利,这俩种类型可以相互转换

着色

在光栅化过程中,需要对多边形进行着色,着色规定了如何利用顶点的颜色来计算构成图元的像素的颜色,目前使用平面着色和Gouraud着色。如果使用平面着色,每个图元的每个像素都被一直地赋予该图元的第一个顶点所指定的颜色

平面着色容易使物体呈现出“块状”,这是因为各颜色之间没有平滑地过渡,一种更好的着色模式是Gouraud着色(平滑着色),在该模式下各顶点的颜色经线性插值得到。

如同Direct3D中的许多其他状态量一样,着色模式由Direct3D状态机控制

//设置平面着色
Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
//设置平滑着色
Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);

着色例程

bool SetUpTriangle()
{
	Device->CreateVertexBuffer(3 * sizeof(ColorVertex), D3DUSAGE_WRITEONLY, ColorVertex::FVF, D3DPOOL_MANAGED, &Triangle, 0);

	ColorVertex* v;
	Triangle->Lock(0, 0, (void**)&v, 0);
	v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0));
	v[1] = ColorVertex(0.0f, 1.0f, 2.0f, D3DCOLOR_XRGB(0, 255, 0));
	v[2] = ColorVertex(1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0, 0, 255));
	Triangle->Unlock();

	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI*0.5, (float)Width / (float)Height, 1.0f, 1000.0f);
	Device->SetTransform(D3DTS_PROJECTION, &proj);
	return true;
}

bool DisplayTriangle(float timeDelta)
{
	if (Device)
	{
		Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
		Device->BeginScene();
		Device->SetFVF(ColorVertex::FVF);
		Device->SetStreamSource(0, Triangle, 0, sizeof(ColorVertex));

		D3DXMatrixTranslation(&WorldMatrix, -1.25f, 0.0f, 0.0f);
		Device->SetTransform(D3DTS_WORLD, &WorldMatrix);
		Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

		D3DXMatrixTranslation(&WorldMatrix, 1.25f, 0.0f, 0.0f);
		Device->SetTransform(D3DTS_WORLD, &WorldMatrix);
		Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
		Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

		Device->EndScene();

		Device->Present(0, 0, 0, 0);
	}

	return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

U2Net使用方法和实现多类别语义分割模型改造

作者的碎碎念:U2Net是用来实现SOD的语义分割,本篇论文会介绍算法内容、主要代码、使用方法,以及如何将二分类语义分割修改为多类别语义模型。如果只想知道怎么训练自己的数据集,或者如何修改网络,可以通过目录进行跳转…

【C语言】错题本(2)

题目: 将题目代码粘贴在下面便于分析: #define MAX_SIZE AB struct _Record_Struct {unsigned char Env_Alarm_ID : 4;unsigned char Para1 : 2;unsigned char state;unsigned char avail : 1;}*Env_Alarm_Record;struct _Record_Struct *pointer (struct _Record_Struct*)m…

【PyCharm Community Edition】:PCAN-USB上位机开发

PCAN-USB上位机开发 一级目录二次开发问题记录继承父类的函数platform.system()判断不准确打开PCANBasic.dll出错延伸阅读一级目录 二次开发 下载链接 问题记录 继承父类的函数 python中super().init() platform.system()判断不准确 根据不同系统,打开DLL的方法不同,本来…

IDEA批量解决Lombok警告,开发者必备技巧!

问题背景 用Lombok的Data注解的时候,因为封装了一个公共的Base基础类,总是会提示以下警告提示: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. …

软件测试的基础(1)

程序员(开发) :编写程序代码(实现产品需求) 产品:收集并设计需求-需求文档(根据用户需求进行产品设计) UI设计师:设计界面,向外展示的形态 前端:用代码实现页面的显示 DBA:数据库设计(系统数据之间的关联) 运维:版本控制和发布、升级迭代,环境搭建和维护 客服:客户支持,…

jsvmp逆向(补环境篇)

书接上回 上篇文章写到tx的jsxmp的算法逆向,文章链接在这里。初试jsvmp加密 。但是可能有伙伴觉得不够详细。 这里放一个大佬的文章链接。 https://www.52pojie.cn/thread-1521480-1-1.html 。其实就是一个变形的xtea加密。 大佬的文章已经讲了很清楚了&#…

小程序测试应该进行哪些测试?起到什么作用?

在如今小程序蓬勃发展的时代,越来越多的企业选择开发小程序来扩大业务。在推出小程序之前,进行全面的测试是至关重要的。 一、小程序测试的注意事项 1、功能测试:测试小程序的各项功能是否正常,包括页面跳转、数据加载、提交操作…

依赖导入失败场景和解决方案

在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种: 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…

恒运资本:股市板块轮动顺口溜?

股市是一个变化多端的场所,不同的板块会因为不同的方针、商场影响、经济形势等多种原因而有不同的体现。因而,不同时期不同板块的轮动也成为了研究的热门。下面咱们就通过一个顺口溜,来深化了解股市板块轮动: “钢铁、水泥、煤炭…

Linux如何安装MySQL

Linux安装MySQL5.7 1、下载 官网下载地址:http://dev.mysql.com/downloads/mysql/ 2、复制下面几个文件 3、检查当前系统是否安装过mysql、检查当前mysql依赖环境、检查/tmp文件夹权限 1)检查当前系统是否安装过mysql,执行安装命令前&am…

CAS策略

CAS CAS(Compare And Swap)比较并交换 CAS是多线程环境下对共享变量进行修改时的一种策略,主要存在三个参数:当前值、预估值、结果 CAS采用的策略是当一个线程要对共享变量进行修改时,需要获取内存中共享变量的值作…

自动驾驶中间件

自动驾驶中间件 1. 什么是中间件2. 中间件的分类3. 自动驾驶为什么需要中间件4. 通信中间件 Reference: 自动驾驶中间件:量产落地的关键技术通俗易懂的告诉你什么是中间件 对于初入自动驾驶行业的人来说,各色各样的新型传感器、线控系统、芯…

基于Java+SpringBoot+Vue前后端分离家政服务管理系统的设计与实现【Java毕业设计·文档报告·代码讲解·安装调试】

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【考研数学】高等数学第五模块 —— 级数(2,幂级数)

文章目录 引言二、幂级数2.1 基本概念2.2 幂级数的收敛半径与收敛域2.3 幂级数的性质2.4 将函数展开为幂级数2.4.1 直接法2.4.2 间接法 2.5 求幂级数的和函数 写在最后 引言 承接前文的常数项级数,我们来继续看看关于幂级数的内容。 二、幂级数 2.1 基本概念 函数…

SpringCloud(二)

1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案&#…

php使用jwt作登录验证

1 在项目根目录下,安装jwt composer require firebase/php-jwt 2 在登录控制器中加入生成token的代码 use Firebase\JWT\JWT; use Firebase\JWT\Key; class Login extends Cross {/*** 显示资源列表** return \think\Response*/public function index(Request $r…

在贸易发展新时代,我为什么推荐你使用全渠道支持平台?

在当今世界,客户希望在与企业互动时获得无缝体验,无论他们使用什么渠道进行联系。这就是全渠道支持的用武之地。通过提供全渠道客户支持,企业可以满足客户期望并提高客户满意度。在本文中,我们将探讨它的好处以及认识全渠道客户沟…

前人栽树,后人才能乘凉!聊聊低代码对开发者的意义

一、低代码很火 LCDP(低代码开发平台)市场规模大,增长迅速。Gartner机构的预测,到2025年,企业70%的新应用将会通过低代码或者无代码技术开发,这将加快低代码市场的全面爆发。而另外一家研究机构海比研究院数…

YOLOv5:对yolov5n模型进一步剪枝压缩

YOLOv5:对yolov5n模型进一步剪枝压缩 前言前提条件相关介绍具体步骤修改yolov5n.yaml配置文件单通道数据(黑白图片)修改models/yolo.py文件修改train.py文件 剪枝后模型大小 参考 前言 由于本人水平有限,难免出现错漏,…

2023高教社杯数学建模国赛题目这样选择

2023高教社杯数学建模国赛题目如何选择 一年一度的数学建模国赛要来啦!!!小编仔细阅读了比赛官方网站上的规则和要求,以及比赛的题型和时间安排,现总结分享给大家。小编将会在开赛后第一时间发布选题建议、所有题目的…