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)的实现 的相关文章

  • Android 形状背景

    是否可以在 xml 中绘制一个形状 并使用 png 作为该形状的背景 我已经有了形状 它是一个带圆角的正方形 我想为该正方形添加背景 是的 您可以使用任何形状文件作为任何视图的背景 此示例创建圆形背景 形状周围有白色和黑色边框 样本 圆角
  • 可从 mdpi 加载而不是 hdpi 中绘制

    我已经使用不同的可绘制目录 ldpi mdpi 和 hdpi 设置了我的项目 我有一个具有两种不同分辨率的背景png drawable mdpi 文件夹中的320x480 和drawable hdpi 中的480x800 两者具有相同的文件
  • 设置AlertBox标题栏背景颜色

    如何更改警报框标题栏的背景颜色 AlertDialog Builder alert new AlertDialog Builder getParent alert setTitle sample alert show 最简单的方法是通过创建
  • 如何在后台保持 iphone ios xmpp 连接处于活动状态?

    iPhone 的 XMPPFramework 功能强大 我已经启动并运行了它 但是如何在后台保持连接 10 分钟以上 我希望获得更多有关如何实现此目标的文档 操作方法 因此 用例非常简单且常见 Joe 在线并且正在使用 iPhone 聊天应
  • 在全日历中显示图像作为背景

    我一直在寻找一些代码来使用图像作为 fullcalendar 中事件的背景 全日历 jQuery https fullcalendar io 但我所能找到的只是向所述事件添加图标的代码 我想做这样的事情 更新 2016 09 23 晚上 8
  • 背景 x 重复负边距重叠

    实际上是我关于堆栈的第一个问题 我试图在重复背景上获得负 右 边距 这样重复图像之间就不会出现间隙 似乎没有 CSS 语法来实现这一点 为了清楚起见 我在下面添加了一张图片 所以我试图让类似饼干的东西的重复图像重叠 这样它们之间就没有间隙
  • 用渐变色绘制一个 D3 圆

    如何用渐变颜色画一个圆 比如说 从黄色到蓝色的渐变 通常 要创建黄色圆圈 我们可以使用以下代码 var cdata 50 40 var xscale 40 var xspace 50 var yscale 70 var svg d3 sel
  • 更改 UIWebView 的文本颜色

    我正在制作一个 epub 阅读器 我将 HTML 页面加载到其中webview webview loadRequest NSURLRequest requestWithURL NSURL fileURLWithPath pagesPath
  • 视频作为网站背景? HTML 5

    我想使用视频作为背景 而不是自动拉伸到整个屏幕 背景 的图像 我还想旋转视频和图像 以便以任何顺序显示随机视频 图像 如果知道如何延迟视频播放 以便视频在网站加载后 30 秒只播放一次 那就太好了 thx 看看我的 jquery video
  • 用顶点之间的渐变填充 matplotlib 多边形

    我正在使用 matplotlib 的 Poly3DCollection 绘制多边形 三角形 的集合 三角形位于具有与其关联的颜色的顶点之间 我目前正在用通过平均三个顶点的颜色确定的纯色填充每个三角形 绘制三角形以形成 3D 表面网格 I w
  • 如何在R中制作渐变颜色填充时间序列图

    How to 填充区域 sp 线下方和上方渐变色 这个例子是在 Inkscape 中绘制的 但我需要垂直渐变 不是水平的 间隔从zero to positive 来自white to red 间隔从zero to negative 来自wh
  • Android GLSurfaceView 具有可绘制背景

    我有一个带有可绘制对象作为背景的 GLSurfaceView 但是在没有 surfaceView setZOrderOnTop true 的情况下渲染时只有背景可见 我需要避免使用 setZOrderOnTop true 因为在 GLSur
  • 如何使用代码隐藏创建 StackPanel -> 边框 -> 背景

    我正在尝试设置 a 的属性TreeViewItem gt StackPanel在 C 中就像这个问题 https stackoverflow com questions 8203316 adding content to a treevie
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 如何用python创建透明的径向渐变?

    我正在尝试创建一个渐变到清晰背景的径向渐变 我的目标是创建这个渐变并将其作为背景粘贴到另一个图像 到目前为止 我已经能够创建圆形渐变 但它不透明 我在 stackoverflow 中找到了以下代码 imgsize 650 650 image
  • 删除窗口的背景图像 WPF

    我在 WPF 中遇到问题 其中窗口在关闭后 应用程序的另一部分尝试写入图像之前不会释放其对背景图像文件的文件锁定 举个例子 假设我有一个 WPF 应用程序 由 3 个窗口 1 个 菜单 选择窗口和另外 2 个窗口组成 两个窗口都会创建一个I
  • 淡出图像上的文字

    我知道如何使用 CSS 透明渐变淡出纯色背景上的文本 但是如何才能淡出图像背景上的文本呢 这是我想要的一个例子 注意 我需要像图像一样的静态效果 而不是动态过渡 CSS mask image可能是您正在寻找的 div background
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写

随机推荐

  • 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 这个成员函