首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我怎样才能使我的立方体的表面在彩虹的所有颜色之间顺利过渡?

我怎样才能使我的立方体的表面在彩虹的所有颜色之间顺利过渡?
EN

Stack Overflow用户
提问于 2022-02-19 17:48:17
回答 1查看 106关注 0票数 0

我在Visual中有一个程序,它正确地呈现一个正在缓慢旋转的三维立方体。我有一个工作的FillTriangle()函数,它用我输入的十六进制代码作为参数填充立方体的正面(例如,紫色的0x00ae00ff )。我已经将每个脸的颜色设置为红色(0xF000000),然后在main()中有一个while循环来更新场景并绘制每个帧的新像素。我还有一个Timer类,它处理所有与时间相关的事情,包括更新()方法,它更新每一个帧的内容。我想通过彩虹的每一种颜色,使脸的颜色从一种颜色平稳地过渡到另一种颜色,我希望它循环起来,只要程序运行就行。现在,它正在平稳地过渡到几种颜色之间,然后突然跳到另一种颜色。例如,它可能顺利地从黄色过渡到橙色到红色,但随后突然跳到绿色。下面是正在执行此操作的代码:

代码语言:javascript
运行
AI代码解释
复制
...
main()
{
...
float d = 0.0f; //float for the timer to increment

 //screenPixels is the array of all pixels on the screen, numOfPixels is the number of pixels being displayed
 while(Update(screenPixels, numOfPixels))
 {
   ...
   timer.Signal(); //change in time between the last 2 signals
   d += timer.Delta(); //timer.Delta() is the average current time
   if(d > (1/30))    // 1 divided by number of frames
   {
     //Reset timer
     d = 0.0f;
     
     //Add to current pixel color being displayed
     pixelColor += 0x010101FF;
   }
   ...
 }
 ...
}

有没有更好的方法来解决这个问题?添加到当前像素颜色是我脑海中的第一件事,它有点工作,但由于某种原因,它一直跳过颜色。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-19 18:30:10

这个常量会随着每一个加法溢出。不仅是一个整数,而且横跨光谱的每个分量: R、G和B。

您需要将您的pixelColor分解为单独的红色、绿色和蓝色颜色,并对每个字节分别进行计算。将阿尔法固定在255 (完全不透明)。检查沿途是否有溢流/下溢。当您到达溢流或下溢时刻时,只需将方向从增量改为递减。

而且,我不会在每个步骤中增加每个组件相同的值(1)。在R,G和B上有相同的增量,您只需在颜色中添加“更多的白色”。如果您想要一个更自然的彩虹环,我们可以这样做:

改变这一点:

代码语言:javascript
运行
AI代码解释
复制
 pixelColor += 0x010101FF;

对此:

代码语言:javascript
运行
AI代码解释
复制
 // I'm assuming pixelColor is RGBA

 int r = (pixelColor >> 24) & 0x0ff;
 int g = (pixelColor >> 16) & 0x0ff;
 int b = (pixelColor >> 8)  & 0x0ff;

 r = Increment(r, &redInc);
 r = Increment(g, &greenInc);
 g = Increment(g, &blueInc);

 pixelColor = (r << 24) | (g << 16) | (b << 8) | 0x0ff;

在主while循环之外定义和初始化redInc、greenInc和blueInc,如下所示:

代码语言:javascript
运行
AI代码解释
复制
int redInc = -1;
int greenInc = 2;
int blueInc = 4;

增量函数是这样的:

代码语言:javascript
运行
AI代码解释
复制
 void Increment(int color, int* increment)  {
     color += *increment;
     if (color < 0) {
         color = 0;
         *increment = (rand() % 4 + 1);
     } else if (color > 255) {
         color = 255;
         *increment = -(rand() % 4 + 1);
     }
 }

这应该是以一种更自然的方式(从更暗到更亮,再到更暗)以一种随机性的方式来循环,所以它不会有两次相同的图案。您可以通过在初始化时调整初始colorInc常数以及如何在Increment函数中更新*increment值来处理随机性。

如果您看到任何奇怪的颜色闪烁,很可能是您的阿尔法字节在错误的位置。可能是高字节,而不是低字节。类似地,一些系统将整数中的颜色排序为RGBA。其他人做ARGB。很有可能RGB被BGR翻转了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71190760

复制
相关文章
Windows Embedded CE 6.0 R3 发布
    继Windows Embedded CE 6.0 R2之后,微软在10月13日又发布了Windows Embedded CE 6.0 R3,它所带来的新特性是我们所期待的,特别是对Silverlight和Flash Lite的支持。     以下部分引自官方的Windows Embedded CE 6.0 R3下载主页:Windows Embedded CE 6.0 R3     Windows Embedded CE 6.0 R3 includes the following new featur
ShiJiong
2018/01/10
1.1K0
USB Gadget 驱动程序框架
左边主机,右边从机;USB 有主机控制器 UHC 和从机控制器 UDC,主机侧有 USB Device Driver,从机侧有 USB Function Driver。
Jasonangel
2023/08/22
3.9K0
USB Gadget 驱动程序框架
USB设备驱动程序开发框架[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179746.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
2.5K0
基于WDM的专用USB设备的驱动程序开发[通俗易懂]
1引言 目前对于诸如USB鼠标、键盘等这样的计算机标准外设,Windows系统已经提供了标准的驱动程序,用户无需再进行任何开发工作。而开发专用USB设备,需要开发专用的驱动程序。 Windows2000/XP操作系统不允许用户程序直接访问硬件设备。为了实现对硬件设备的访问和控制,必须通过操作系统所认可的驱动程序对硬件设备实现间接访问和控制。驱动程序通常被认为是操作系统的组成部分,所以,开发驱动程序有严格的规范,被认为是“计算机高手”的工作。而利用DDK进行基于WDM(Win32 Driver Model)驱动程序开发,使驱动程序的开发变成了一项比较简单的工作。 2 Win32驱动程序模型 USB设备驱动程序必须符合由Microsoft为Windows 98及其后版本所定义的Win32驱动程序模型(Win32 Driver Model,WDM)规格。这些驱动程序称为WDM驱动程序,扩展名为.sys。 WDM定义了一个基本模型,处理所有类型的数据。例如,USB类驱动程序为所有USB 设备提供了一个抽象的模型,并具有由所有客户驱动程序使用的定义好的接口。有了对所有设备类型共同的核心驱动程序模型,使驱动程序开发人员更容易从一种类型的设备移动到另外一种类型的设备上去。而且它也意味着驱动程序模型的内核实现尽可能是固定的。 USB是使用标准Windows系统USB类驱动程序访问USBDI(Windows USB驱动程序接口)的USB设备驱动程序。USBD.sys就是Windows系统中的USB类驱动程序,它使用UHCD.sys来访问通用的主控制器接口设备,或者使用OpenHCI.sys访问开放式主控制器接口设备。USBHUB.sys是根集线器和外部集线器的USB驱动程序。在PCI枚举器发现了USB主控制器之后,它会自动装入相关的驱动程序。 3 Windows USB驱动程序接口 大多数客户化的USB设备需要由用户来编写设备驱动程序,以响应内核态或用户应用程序的请求。在内核级,命令由客户驱动程序使用内部IOCTL发送给USB系统,例如IOCTL-INTERNAL-USB-SUBMIT-URB允许发出USB请求块(URB)给系统USB驱动程序。URB允许发出几个功能调用给USB系统。用户态USB实用程序也可以发出几个普通IOCTL给USB设备,目的仅仅是得到连接设备的信息。 3.1函数驱动程序 函数驱动程序(function driver)让应用程序与USB设备,通过API函数来沟通。这些API函数属于Windows的Win32子系统,Win32子系统同时也管理着执行应用程序。函数驱动程序与较低级的总线驱动程序沟通,总线驱动程序控制着硬件。 图1是应用程序与各个驱动程序,如何一起完成USB通信的结构图。当设备或子类别的要求超过类别驱动程序的能力时,会有辅助的过滤器驱动程序来类别驱动程序的能力。一个上层的过滤驱动程序位于类别驱动程序的上方。这样,从客户应用程序传来的要求,会先经过上层的过滤驱动程序,然后才传给类别函数驱动程序。一个下层的过滤驱动程序位于类别驱动程序和总线驱动程序之间,如图1。类别驱动程序会将要求传给下层的过滤驱动程序,然后再传给总线驱动程序。 图1应用程序与驱动程序完成USB通信的结构 通用串行总线驱动程序(USBD.SYS)是USB系统中负责管理通用串行总线的工作,位于主机上的一个软件。USBD负责控制所有的USB协议操作和高层的中断处理控制。在Windows98及以上版本中,Microsoft定义了一个新的设备驱动程序模型,称之为Windows设备驱动程序模型(WindowsDriver Model或WDM)。 USB客户应用程序也是一种设备驱动程序,通过定义的一个称之为USB接口的层间接口来访问其下方的USB软件。应用程序正是通过这些USB客户软件来实现与USB设备之间的通信。 针对USB客户应用程序的开发,相应版本的Windows操作系统的设备驱动程序开发包(Device Driver Developer’s Kit,即DDK)给出了相应的USB接口函数。并提供了对于这些函数具体使用的参考文档。 3.2 USBDI的IOCTL 为了编写USB设备驱动程序,通常还要在源代码中包含DDK所提供的几个头文件。这些头文件在Windows98下存放在/98DDK/inc/win98目录中,在Windows 2000下存放在/NTDDK/inc/win2000目录中。这些头文件的用途可以总结如下: usb100.h 定义了在USB设备驱动程序设计中所要用到的各种常量和数据结构。 Usbdi.h USBDI例程,其中包括对USBD和USB设备驱动程序通用的数据结构,适用于内核和用户模式。 Usbdlib.h URB构造和各种例程,定义了USBD所输出的服务,适用于内核和用户模式。 Usbioctl.h 给出了对IOC
全栈程序员站长
2022/09/27
1.7K0
制作U盘启动时【usb-hdd和usb-zip的区别】
USB-HDD即USB Hard Drives 的缩写,硬盘模式,即硬盘模式。通过把U盘模拟成硬盘来启动安装在U盘里的PE系统,通过模拟之后,就像是直接使用硬盘启动是一样的。 USB-ZIP模式即大容量软盘模式,使用这个模式制作U盘启动盘,进入U盘PE系统之后,它显示的盘符为A盘,即软盘。
红目香薰
2022/11/29
6.7K0
制作U盘启动时【usb-hdd和usb-zip的区别】
usb转rs485测试软件,usb转rs485驱动程序
usb转rs485线必须安装usb转rs485驱动程序才可以正常使用,而本次发布的这个usb转rs485驱动,就是那个东东啦。
全栈程序员站长
2022/08/11
5.4K0
usb转rs485测试软件,usb转rs485驱动程序
Windows CE无法连接Win 10
1.在打开的服务界面中,找到“基于Windows Mobile 2003的连接设备”
_一级菜鸟
2020/08/11
2.5K0
Windows CE无法连接Win 10
电脑开机错误代码0xc0000428_状态为0xc0000428
有用户反馈电脑启动时,屏幕突然出现错误码0xc0000428,无法进入系统。本文将针对这个问题,分析出现错误码0xc0000428的原因,并为大家提供解决方案。
全栈程序员站长
2022/11/10
3.4K0
Windows CE 系统进程外组件应用开发
这篇文章说明了如何使用 WindowS CE 6.0 系统的 DCOM ,开发 com 服务进程。向客户端提供跨进程的 COM 组件服务,以及自定义接口代理 / 存根 dll 的建立,注册。
雪影
2018/08/02
8150
Windows CE 系统进程外组件应用开发
Windows查看系统启动时长 uptime
The Get-Uptime cmdlet was introduced in PowerShell 6.0.
Windows技术交流
2023/05/17
1.7K0
EBox4300 Dev Start
EBox4300 Dev Start EBOx4300是ICOP Technology Inc.出的一款针对WinCE学习的jumpstart kit, 同时也是imagine cup-embedded的指定硬件平台。下面简单介绍一下开发环境的安装和一个简单托管代码工程的调试。 一、开发环境安装和配置 1. Visual Studio 2005 2. Visual Studio 2005 SP1 3. Visual Studio 2005 SP1 update for Vista(如果是XP系统,就可以跳
ShiJiong
2018/01/11
1K0
EBox4300 Dev Start
usb转rs485测试软件,usb转rs485「建议收藏」
usb转rs485电脑版驱动中还含有安装教程,在安装前可以先看看使用说明再安装。将USB转换线插入电脑的USB接口中,系统会提示检测到新设备并出现新硬件添加向导,选择从列表或指定位置安装,手动安装,找到刚才驱动的解压目录,让WINDOWS自动搜索更新驱动即可。
全栈程序员站长
2022/08/10
4.1K0
usb转rs485测试软件,usb转rs485「建议收藏」
一款超好用的Mac系统NTFS磁盘读写软件Tuxera NTFS for Mac2022
Tuxera NTFS for Mac2022是一款Mac系统NTFS磁盘读写软件。在系统默认状态下,MacOSX只能实现对NTFS的读取功能,Tuxera NTFS可以帮助MacOS 系统的电脑顺利实现对NTFS分区的读/写功能。Tuxera NTFS for Mac目前最新版是2022版本。
用户9208731
2022/12/14
3.5K0
一款超好用的Mac系统NTFS磁盘读写软件Tuxera NTFS for Mac2022
基于WDF的PCI/PCIe接口卡Windows驱动程序(5)-如何为硬件移植驱动程序
原文地址:http://www.cnblogs.com/jacklu/p/6139347.html
用户7043923
2020/03/12
1.7K0
基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)
原文出处:http://www.cnblogs.com/jacklu/p/4687325.html
用户7043923
2020/03/12
2.5K0
基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
原文出处:http://www.cnblogs.com/jacklu/p/4679304.html
用户7043923
2020/03/12
1.6K0
【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 尝试进行瞬移操作 | 尝试查找飞天漏洞 )
在上一篇博客 【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 人物数据内存结构 | 人物三维坐标数据分析 ) 中 , 已经找出了 任务的 x, y , z 三个坐标值 , 修改上述坐标值 , 就可以移动到指定位置 ;
韩曙亮
2023/03/29
3650
【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 尝试进行瞬移操作 | 尝试查找飞天漏洞 )
windows解决SpringBoot启动时:APPLICATION FAILED TO START
出现这种情况,就是端口被占用了,在linux下非常的简单直接查到之后kill就ok了。
手撕代码八百里
2020/10/26
3K0
Windows 内核驱动程序完整性校验的原理分析
在上一篇文章中提到了 Windows Vista 及之后版本的 Windows 操作系统在驱动程序加载完成后,驱动中调用的一些系统回调函数(如 ObRegisterCallbacks,可用来监控系统中对进线程句柄的操作,如打开进程、复制线程句柄等)等 API 中会通过 MmVerifyCallbackFunction 函数对该驱动程序进行完整性检查,检测未通过则会返回 0xC0000022 拒绝访问的返回值。在这篇文章中将会对这个函数进行简单的分析,以明确其原理。
稻草小刀
2022/12/12
1.2K0
Windows 内核驱动程序完整性校验的原理分析
USB Storage启动EBox4300
参考《eBox-4300 Windows Embedded CE 6.0 R2 JumpStart rev 3.5》中,EBox4300可以通过以下途径启动: • Internal IDE storage • CompactFlash • USB Floppy • USB storage • USB CD/DVD-ROM drive • Remote Network Boot using PXE EBox4300默认是从Internal IDE storage启动的。当然,我们也可以通过USB storag
ShiJiong
2018/01/11
6110
USB Storage启动EBox4300

相似问题

到底是什么?

14

"-<“到底是什么?

12

“内存子系统”的定义是什么?

22

补丁到底是什么?

29

getGlobalVisibleRect()到底是什么?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文