Ogre-渐变背景色(gradient background)的实现

2023-05-16

转载自:http://blog.csdn.net/hefee/article/details/6287341


背景色在ogre里面是通过ViewPort类中的setBackgroundColour()这个成员函数实现的,不过此类只提供给单一颜色的设置!!

 

不过,我们可以通过间接的方法去创建渐变的背景色,下面详细介绍:

 

1. 重构Ogre::Rectangle2D类:(OgreColourRectangle2D.h)


 

#ifndef OGRECOLOUREDRECTANGLE2D_H
#define OGRECOLOUREDRECTANGLE2D_H

#include "OgreRectangle2D.h"

class ColouredRectangle2D : public Ogre::Rectangle2D
{
public:
   ColouredRectangle2D(bool includeTextureCoordinates = false);
   ~ColouredRectangle2D();

   void setColours(const Ogre::ColourValue &topLeft, const Ogre::ColourValue &bottomLeft, const Ogre::ColourValue &topRight, const Ogre::ColourValue &bottomRight);

};

#endif // OGRECOLOUREDRECTANGLE2D_H


2. 重构类的实现: (OgreColourRectangle2D.cpp)


#include "OgreColouredRectangle2D.h"

#include "OgreHardwareBufferManager.h"

//#define POSITION_BINDING 0
//#define NORMAL_BINDING 1
//#define TEXCOORD_BINDING 2
#define COLOUR_BINDING 3

ColouredRectangle2D::ColouredRectangle2D(bool includeTextureCoordinates /*= false*/):Ogre::Rectangle2D(includeTextureCoordinates)
{
   Ogre::VertexDeclaration* decl = mRenderOp.vertexData->vertexDeclaration;

   decl->addElement(COLOUR_BINDING, 0, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
   Ogre::VertexBufferBinding* bind = mRenderOp.vertexData->vertexBufferBinding;

    Ogre::HardwareVertexBufferSharedPtr vbuf = 
        Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(
        decl->getVertexSize(COLOUR_BINDING),
        mRenderOp.vertexData->vertexCount,
        Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);

    // Bind buffer
    bind->setBinding(COLOUR_BINDING, vbuf);
}

ColouredRectangle2D::~ColouredRectangle2D()
{
}

void ColouredRectangle2D::setColours(const Ogre::ColourValue &topLeft, const Ogre::ColourValue &bottomLeft, const Ogre::ColourValue &topRight, const Ogre::ColourValue &bottomRight)
{
   Ogre::HardwareVertexBufferSharedPtr vbuf = 
      mRenderOp.vertexData->vertexBufferBinding->getBuffer(COLOUR_BINDING);
   unsigned int* pUint32 = static_cast<unsigned int*>(vbuf->lock(Ogre::HardwareBuffer::HBL_DISCARD));

   const Ogre::VertexElementType srcType = Ogre::VertexElement::getBestColourVertexElementType();

   *pUint32++ = Ogre::VertexElement::convertColourValue( topLeft, srcType );

   *pUint32++ = Ogre::VertexElement::convertColourValue( bottomLeft, srcType );

   *pUint32++ = Ogre::VertexElement::convertColourValue( topRight, srcType );

   *pUint32++ = Ogre::VertexElement::convertColourValue( bottomRight, srcType );

   vbuf->unlock();
}


3. 重构类应用

// Create background material
      Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("Background""General");
      material->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
      material->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
      material->getTechnique(0)->getPass(0)->setLightingEnabled(false);
       
      // Create background rectangle covering the whole screen
      ColouredRectangle2D* rect = new ColouredRectangle2D();
      rect->setCorners(-1.01.01.0, -1.0);
      rect->setMaterial("Background");
      
      // Set the colours
      rect->setColours( Ogre::ColourValue::Red, Ogre::ColourValue::Green, Ogre::ColourValue::Blue, Ogre::ColourValue::Black ); 

      // Render the background before everything else
      rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_BACKGROUND);
       
      // Use infinite AAB to always stay visible
      Ogre::AxisAlignedBox aabInf;
      aabInf.setInfinite();
      rect->setBoundingBox(aabInf);
       
      // Attach background to the scene
      SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Background");
      node->attachObject(rect);

完成以上三步,就可以实现一个viewport的渐变背景色。基本原理是:创建s一个拥有渐变颜色的2D Rectangle,并使其作为背景渲染。有几点值得注意的时候:

 

1. #define COLOUR_BINDING 3,以及后续用到COLOUR_BINDING的各个地方。由于Ogre的各个版本的差别(本人使用的是1.7版本的),一些低版本的Ogre没有实现像cpp中注释的前三种,即POSITION、Normal、TEXCoord,此时如果冒然使用Colour,就会出现意想不到的错误。(当前的Mogre版本就没有实现3个,具体哪几个不慎清楚)

2. rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_BACKGROUND);这句很重要。

3. 如果要使用某个特定的图片作为背景,则简单的多:有兴趣的可以自己试试

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

Ogre-渐变背景色(gradient background)的实现 的相关文章

  • 如何执行更新UI视图Android的后台作业[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的 Android 应用程序中 我有一个带有视图的活动 例如 在活动开始或创建主布局时 我想启动一个后台作业 每 5 秒从主布局更
  • Android - 如何创建布局选择器(如 ImageButton 选择器)

    我有一个 ImageButton 和一个包裹该按钮的 LinearLayout 如下所示
  • 各种 Android 设备的应用程序背景大小

    我正在为所有 Android 设备的应用程序设计背景 我在想图像的大小 以像素为单位 是多少 从开发者网站我发现了以下等式 px dp dpi 160 那么 px 取决于两个变量 首先 dp 我们有 xlarge screens are a
  • 从扩展后台或弹出窗口发送消息到内容脚本不起作用

    我知道这个问题已经以不同的方式被反复问过 但我尝试过一遍所有的答案 希望我没有错过任何人 但没有一个对我有用 这是我的扩展程序的代码 显现 name test version 1 1 background scripts contextMe
  • 如何在bash中列出所有后台pid

    要么我无法正确表达我的搜索 要么答案不容易找到 但我正在尝试找出如何列出我的所有后台任务 PID 例如 到目前为止 我发现要列出我们使用的最后一个 PID 但现在我想列出之前任务的 PID 如果存在 但我找不到如何做到这一点 最终我想列出我
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • 如何更改 aptana studio 的背景颜色?

    如何将 Aptana IDE 或整个主题 的黑色背景更改为其他背景 例如蓝色 正如 gyozo 在评论中提到的 对于蓝色主题 请使用 窗口 gt 首选项 gt Aptana Studio gt 主题 并选择 Eclipse 主题
  • 将 TextField 下划线颜色更改为渐变

    我可以更改轮廓颜色TextField s使用以下代码将颜色更改为纯色 TextField decoration InputDecoration focusedBorder UnderlineInputBorder borderSide Bo
  • 在后台使用 HERE_DOC 方法运行脚本

    我有一个应该在后台运行的脚本 我必须在运行 bash 后立即回答一个问题 我该怎么做 nohup python script py lst lt
  • WPF 3D - 在复杂几何体上映射渐变画笔

    我想问是否有人知道如何在 WPF 3D 中的复杂对象上映射渐变画笔 结果应该类似于 matlab 中的 3D 图像 例如 3D 函数 假设您有一些想要可视化的 3 维数据 并且想要通过颜色区分某些级别的值 给定一个 GradientBrus
  • 在flutter中跟踪背景位置时使用background_locator插件时出现问题

    我正在尝试使用 flutter 跟踪后台位置 为此我正在使用背景定位器 https pub dev packages background locator插入 它的实现方式是注册某些静态回调函数 我声明了一个 File 类型的类变量来在后台
  • 如何为活动添加背景图片?

    使用主题或 ImageView use the android backgroundxml 中的属性 如果您想将其应用到整个活动 最简单的方法是将其放在布局的根目录中 因此 如果您有一个relativelayout作为您的xml的开头 请将
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • bash后台进程修改全局变量

    在我的 Bash 脚本中 我有一个全局变量foo设置为某个值和函数过程back func这是在后台运行的 我希望后台进程能够访问foo并修改其值 以便主进程可以看到变化 我的脚本的结构如下 bin bash foo 0 function b
  • 如何在CSS中的图像中添加渐变/滤镜

    我这里有一张图片 我想复制 theverge com 网站中的 css 样式 见下图 我将在我的博客 主页 中使用它 因为我试图复制网站 theverge com 的内容 这就像在半透明渐变和特色图像上显示帖子标题和作者姓名 请帮忙 这是我
  • 在 Interface Builder 中添加背景图像

    我正在尝试使用 Xcode 4 2 添加自定义图像作为我的应用程序的背景 但我不太确定该怎么做 我可以在 Interface Builder 中添加纯色作为背景 但我没有看到添加自定义图像的选项 我在谷歌上搜索了这个问题并研究了几个小时 但
  • iOS 5.0中不调用UINavigationBar的drawRect

    我已经覆盖 放置在类别中 或混合 UINavigationBar 的drawRect 以显示自定义背景 在 iOS 5 中它不起作用 我应该怎么办 为导航栏设置自定义背景以支持 iOS 5 和 iOS 4 http www mladjana

随机推荐

  • View.post VS Handler.post的区别和使用场景对比

    View post 当对应的Widget View 没有attach到window的时候 xff0c 对应的Runnable会被提交到 ViewRootImpl RunQueue xff0c 如果已经attach的话 xff0c 会提交给U
  • Android 数据库安全:用户退出后,事务回滚日志依然保存有相关的数据信息

    详情 xff1a data data package name databases dday db data data package name databases dday db shm data data package name da
  • 关于IPhone无法收发短信---设置iphone短信中心号码

    这是个人拨打客服所收到解决短信 xff1a 尊敬的客户 xff0c 您好 xff01 如您反映的问题未解决或还有其他手机问题 xff0c 您可直接关注终端服务基地的官方微信公众号 xff1a cmcczdfw xff0c 随时随地获取便捷终
  • UART串口通信

    什么是串行通信 xff1f 将数据字节分成一位一位的形式在一条传输线上逐位地发送 优点 xff1a 成本低 xff0c 控制复杂 什么是异步通信 xff1f 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程 为使双方的
  • CAN总线数据帧

    CAN总线数据帧 1 xff0c 帧起始 xff08 SOF xff09 标识一个数据帧的开始 xff0c 用于帧同步 一个显性位 只有总线在空闲期间节点才能够发送SOF 2 ID 用于确定唯一一条报文 标准帧有11位 xff0c 扩展帧有
  • yolov3算法中关于loss={'yolo_loss': lambda y_true, y_pred: y_pred}的理解

    yolov3算法中关于loss 61 yolo loss lambda y true y pred y pred 的理解 参考文献 xff1a xff08 1 xff09 https www jianshu com p 7e45586c44
  • 【FreeRTOS】内存溢出检测

    Stack overflow detection FreeRTOS官方给了两种内存溢出检测方案 xff1a FreeRTOS stacks and stack overflow checking FreeRTOS is a portable
  • Linux实现简单的udp服务端和客户端(C/C++)

    udp server cpp include lt iostream gt include lt sys types h gt include lt sys socket h gt include lt unistd h gt includ
  • 开源日志库<log4cplus+VS2008使用>整理

    原创作品 xff0c 允许转载 xff0c 转载时请务必以超链接形式标明文章 原始出处 作者信息和本声明 否则将追究法律责任 http pyhcx blog 51cto com 713166 143549 本文出自 碧海笙箫 博客 xff0
  • 二.extern "C"

    extern关键字 xtern可以置于变量或者函数前 xff0c 以标示变量或者函数的定义在别的文件中 xff0c 提示编译器遇到此变量和函数时在其他模块中寻找其定义 此外extern也可用来进行链接指定 一 extern 34 C 34
  • Matlab2013b和Visual Studio 2013混合编程总结

    Matlab2013b和VisualStudio 2013混合编程总结 一 关于软件版本和安装的说明 一般来说 xff0c Matlab版本需高于或者等于VisualStudio的版本 综合版本功能和兼容问题 xff0c 我们选用了Matl
  • [linux] xlwt引起的字符串长度限制解除 & 递归深度限制解除 &Overflow问题

    1 xlwt引起的字符串长度限制 Exception String longer than 32767 characters 由于xlwt引起的excel写入的字符串 xff0c 长度不能大于32767 1 换txt写入 xff0c 或者用
  • 宏定义 宏参数

    带参数的宏定义 xff0c 利用宏参数创建字符串 运算符 看看以下两个宏定义 xff1a define PSQR x printf 34 The square of x is d n 34 x x define PSQR x printf
  • 舵机的PD控制

    PID 舵机以及差速PD调节 span class token keyword struct span span class token class name PID span span class token punctuation sp
  • 位置环与速度环的串级PID

    WHEELTEC的串级pid参考代码 span class token keyword float span Position KP span class token operator 61 span span class token nu
  • 智能车摄像头算法——圆环元素

    入环 1 入环的函数 xff08 1 xff09 搜上下边线 xff08 2 xff09 找凸起的弧 xff08 3 xff09 两点之间补线 xff08 4 xff09 判断上线是否单调 2 找圆环3 补线入环出环 1 入环的函数 xff
  • ROS的代价地图与AMCL定位原理

    地图服务与AMCL定位 costmap xff08 代价地图 xff09 AMCL定位 xff08 自适应蒙特卡罗定位 xff09 costmap xff08 代价地图 xff09 1 地图文件格式 xff1a 除了pgm xff08 便携
  • ROS路径规划算法

    ROS路径规划算法 全局路径规划Dijkstra算法A 算法 局部路径规划DWA算法TEB算法 全局路径规划 提供Dijkstra和A算法 xff0c 默认使用Dijkstra Dijkstra是把从出发点到终点的整个栅格地图上的所有的点
  • STM32常用功能配置

    STM32基本代码 设置外部中断定时器中断定时器产生pwmAD多通道转换DMA 43 AD扫描多通道转换iic协议读取数据SPI协议读取数据 设置外部中断 中断优先级分组 外部中断 AFIO作用 注意 xff1a 1 相同的Pin不能同时触
  • Ogre-渐变背景色(gradient background)的实现

    转载自 xff1a http blog csdn net hefee article details 6287341 背景色在ogre里面是通过ViewPort类中的setBackgroundColour xff08 xff09 这个成员函