Direct3D颜色

在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.hqwc.cn/news/100953.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【强化学习】基本概念

基本大概框架 强化学习的主要角色是 智能体 (agent)和 环境,环境是智能体存在和互动的世界。智能体根据当前的环境做出action,action影响环境。然后智能体根据新的环境再进行action。 基础用语 状态(state, s)&…

Multimodel Image synthesis and editing:The generative AI Era

1.introduction 基于GAN和扩散模型,通过融入多模态引导来调节生成过程,从不同的多模态信号中合成图像;是为多模态图像合成和编辑使用预训练模型,通过在GAN潜在空间中进行反演,应用引导函数,或调整扩散模型…

VS2022+CMAKE+OPENCV+QT+PCL安装及环境搭建

VS2022安装: Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置_vs安装教程_我不是大叔丶的博客-CSDN博客 CMAKE配置: win11下配置vscodecmake_心儿痒痒的博客-CSDN博客 OPENCV配…

使用Apache Doris自动同步整个 MySQL/Oracle 数据库进行数据分析

Flink-Doris-Connector 1.4.0 允许用户一步将包含数千个表的整个数据库(MySQL或Oracle )摄取到Apache Doris(一种实时分析数据库)中。 通过内置的Flink CDC,连接器可以直接将上游源的表模式和数据同步到Apache Doris&…

如何用SSH克隆GitHub项目

诸神缄默不语-个人CSDN博文目录 使用场景:由于不可知的网络问题,无法用HTTPS克隆GitHub项目。 报错fatal: unable to access https://github.com/PolarisRisingWar/llm-throught-ages.git/: GnuTLS recv error (-110): The TLS connection was non-pro…

Scrum认证高级Scrum Master (A-CSM) 认证培训课程

课程简介 高级ScrumMaster (Advanced Certified ScrumMaster, A-CSM) 认证课程是国际Scrum联盟推出的进阶级Scrum认证课程,是Scrum Master通往专业级敏捷教练必经的学习路径。 在ScrumMaster(CSM)认证课程中,您学习到了Scrum的价…

Navicat 携手华为云 GaussDB,联合打造便捷高效的数据库开发和建模工具方案

近日, Navicat Premium 顺利完成与华为云 GaussDB的兼容性测试认证,并获得华为云授予的技术认证书。 ​ 合作 Navicat 作为华为云 GaussDB 生态工具合作伙伴以及 Gocloud 合作伙伴,此次合作旨在通过Navicat 多年来在数据库开发管理工具上的积…

C++(Liunx) 使用cut截 取出Ubuntu用户的家目录,要求:不能使用“:“作为分割.

使用cut截 取出Ubuntu用户的家目录,要求:不能使用":"作为分割

Apache Doris 2.0 如何实现导入性能提升 2-8 倍

数据导入吞吐是 OLAP 系统性能的重要衡量标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。随着 Apache Doris 用户规模的不断扩大, 越来越多用户对数据导入提出更高的要求,这也为 Apache Doris 的数据导入能力带来了更大的挑战…

关闭vscode检查更新

要关闭 Visual Studio Code 的自动检查更新功能,请按照以下步骤进行操作: 打开 Visual Studio Code。点击左侧的扩展图标(四个方块组成的图标)。在扩展面板中,点击右上角的齿轮图标,选择 “扩展设置”。在…

《C++设计模式》——创建型

前言 创建型为了创建东西才是有用的,创建型设计模式使用的场景: 1、创建一个东西; 2、可重复利用; 3、灵活性高,代码可因地制宜。 Factory Method(工厂模式) 简单工厂模式 主要用于创建对象。新添加类时&#xff0…

二叉树的递归遍历和非递归遍历

目录 一.二叉树的递归遍历 1.先序遍历二叉树 2.中序遍历二叉树 3.后序遍历二叉树 二.非递归遍历(栈) 1.先序遍历 2.中序遍历 3.后序遍历 一.二叉树的递归遍历 定义二叉树 #其中TElemType可以是int或者是char,根据要求自定 typedef struct BiNode{TElemType data;stru…