OSG学习:OSG组成(二)——渲染状态和纹理映射_osg 禁用纹理-程序员宅基地

技术标签: OSG  纹理  OSG(Open Scene Graph)  渲染  StateSet  Texture  

以下内容来自: 

1、《OpenSceneGraph三维渲染引擎编程指南》肖鹏 刘更代 徐明亮 清华大学出版社 
2、《OpenSceneGraph三维渲染引擎设计与实践》王锐 钱学雷 清华大学出版社

3、自己的总结


一 概述

根据前面的例子可以知道,三维场景中的几何体通常是由顶点组成的,但要真实显示某个物体需要对几何体进行渲染。场景树和渲染树共同组成了OSG。通过纹理和光照的配合,可以屏蔽物体粗糙不平的现象,使场景达到接近真实的效果。

OSG几乎封装了OpenGL所有的渲染接口:光照、材质、纹理、Alpha测试、图像融合、面剔除、雾效、深度测试,以及着色语言(GLSL)中顶点着色器(Vertex Shader)、几何着色器(Geometry Shader)、片元着色器(Fragment Shader)。


二 渲染树:渲染状态-渲染属性和渲染模式

渲染树是一棵以StateSet和RenderLeaf为节点的树。

场景组织中知道,OSG采用包围体层次的形式来构建不同层次、不同功能的场景节点,每个节点都可以保存多种类型的渲染属性和模式,而父子节点之间则存在多种渲染状态的继承关系。OSG将渲染状态分为属性(Attribute)和模式(Mode)两部分,一个节点所赋予的多个渲染状态(包括各种属性和模式)称为一个渲染状态几何,用StateSet类来表示。

渲染属性就是控制渲染特性的状态变量,如雾的颜色或Blend融合函数都是OSG的状态属性。OSG中的渲染模式就是模型样式,与OpenGL的状态特性几乎是一一对应的,并在OpenGL中通过函数glEnable()和glDisable()进行控制。简单理解,渲染模式就是指渲染的某个功能,例如灯光、雾效等,它只有开启和关闭两种状态;而渲染属性时渲染模式的属性变量,例如灯光的颜色、灯光的强度、雾效的颜色等。

能够应用渲染状态集的对象不一定是场景中的节点Node,也可以是绘制对象Drawable。如果存在一个叶节点Geode,它包含了多个几何形体,那么这个叶节点和每一个几何体都可以拥有自己的渲染属性和模式结合,因此可以创造底部被云雾笼罩,顶部有阳光照耀的房屋等。

OSG为每个状态属性定义了不同的类,所有的属性类均继承自osg::StateAttribute,它是一个无法直接实例化的虚基类。

OSG将所有的属性和模式分为两大部分:纹理(texture)和非纹理(non-texture)。由于纹理属性需要特别为多重纹理设置纹理单元,因此OSG为纹理属性的设置提供了不同的接口。


三 设置渲染属性和渲染模式

1、设置渲染属性

修改属性类的实例化——设置该类的数值——用osg::StateSet::setAttribute()将其关联到StateSet。

例如,实现面剔除(face culling)的属性(以下代码用到了位屏蔽技术):

//获取变量geom的State指针
osg::StateSet *state = geom->getOrCreateStateSet();
//创建并添加CullFace属性类
osg::CullFace *cf = new osg::CullFace(osg::CullFace::BACK);
state->setAttribute(cf);

2、设置渲染模式

使用osg::StateSet::setMode()设置允许或禁止某种模式。

例如,打开雾效模式的许可:

//获取一个State实例
osg::StateSet *state = geom->getOrCreateStateSet();
//允许这个State的雾效模式
state->setMode(GL_FOG, osg::StateAttribute::ON);

3、设置渲染属性和模式

使用osg::StateSet::setAttributeAndMode()方法。

4、状态继承

当设置节点的渲染状态后,其子节点会继承当前状态,而若子节点对该渲染状态设置了不同的属性参数,为了允许用户根据场景图形中任意位置的渲染属性和模式需求单独改变原有的状态继承特性,OSG提供了几种枚举形式:

osg::StateAttribute::OVERRIDE //所有子节点都将继承这一属性或模式,子节点对其更改无效
osg::StateAttribute::PROTECTED //设置了这一属性的子节点的渲染属性或模式不会受到父节点的影响
osg::StateAttribute::INHERIT //强制子节点继承父节点的渲染状态,自己本身的渲染状态被解除


四 纹理映射

物体的纹理是可以根据用户视点的远近来自动调整和变化的,即纹理图像的细节层次(Mipmap);并且当纹理无法完全覆盖几何体的每一个顶点时,通过边界截取方式的调整,可以重复设置同一块纹理,或者将边界颜色应用到未覆盖的物体表面上。

OSG的纹理映射主要包括一维纹理、二维纹理、三维纹理、凹凸纹理、多重纹理、Mipmap纹理、压缩纹理和立方纹理等。

二维纹理:应用最广泛的纹理类型,将二维矩形图像映射到三维物体上。要求图像的宽度和高度必须是2的幂次方,单位是纹素。如果图像不符合要求,则会自动重采样到符合要求,因此会消耗时间和系统资源。

一维纹理:将二维纹理的高度设为1,且顶部和底部不存在边框,可以视其为只在S方向上变化的一维纹理。因此也要求纹理宽度为2的幂次方。如一条彩色丝带,水银柱的升降等。其操作效率高于高度值为1的二维纹理。

三维纹理:最常用于医学和地质,可以用来表达医学CT图像和岩层状态。理解为多层二维子纹理所构成的一个立方体,其中的每一个纹素此时称为一个体素。因此也要求纹理宽度、高度和深度为2的幂次方。会耗费大量的系统资源。

二维纹理数组:一种较为特殊的纹理类型,与三维纹理的概念并无本质上的区别。主要用于OpenGL着色语言(GLSL)程序中二维纹理数组对象的表达。

立方图纹理:主要用于反射贴图或环境贴图的表达,如对于场景中天空景象的渲染。使用六个二维图像来表达一个立方体的六个面,S/T/R坐标轴的原点为这个立方体的中心点。

矩形纹理:OpenGL中的传统纹理类型限制了图像的尺寸必须是2的幂次方,而矩形纹理取消了这种限制,它支持任意尺寸的二维图像作为纹理。不受“2的幂次方”限制的图像称为NPOTS纹理(Non-power-of-two Sized),它避免了传统二维纹理对于任意尺寸图像的重采样过程,并且可以节省更多的系统空间,但NPOTS纹理不支持Mipmap的过滤,对于纹理边界截取方式的设置也只有GL_CLAMP/GL_CLAMP_TO_EDGE/GL_CLAMP_TO_BORDER三种。


五 节点方法

1、osg::StateSet类

StateSet() //默认构造函数
int compare(const StateSet &rhs, bool) const //比较两个渲染状态集,如果是一样的,则可采用共享状态集的方式进行优化
ParentList getParents() //获取渲染状态集的父对象,一个渲染状态集可以被多个节点或可绘制体共享
void setMode(StateAttribute::GLmode, StateAttribute::GLModeValue) //启用或禁用一种渲染模式。渲染模式集可以使用glEnable()/glDisable()管理的OpenGL状态量;状态的开关设置可取ON/OFF/OVERRIDE/PROTECTED/INHERIT
StateAttribute::GLModeValue getMode(StateAttribute::GLMode) const //获取一种已设置的渲染模式
void setAttribute(StateAttribute *attribute, StateAttribute::OverrideValue) //设置一个渲染属性,并设置其开关值
void setAttributeAndMode(StateAttribute *attribute, StateAttribute::GLModeValue) //设置一个渲染属性,同时设置与之绑定的渲染模式
StateAttribute *getAttribute(StateAttribute::Type type, unsigned int member) //获取一个已设置的渲染属性
void setTextureMode(unsigned int unit, StateAttribute::GLMode mode, StateAttribute::GLModeValue) //启用或禁用纹理相关的渲染模式,此时要额外指定纹理单元
StateAttribute::GLModeValue getTextureMode(unsigned int unit, StateAttribute::GLMode) const //获取一个已设置的纹理相关的渲染模式
void setTextureAttribute(unsigned int unit StateAttribute *attribute, StateAttribute::OverrideValue) //设置一个纹理相关的渲染属性,并设置其开关值
void setTextureAttributeAndModes(unsigned int unit, StateAttribute *attribute, StateAttribute::GLModeValue) //设置一个纹理相关的渲染属性,同时设置与之绑定的渲染模式
StateAttribute *getTextrueAttribute(unsigned int unit, StateAttribute::Type type) //获取一个已设置的纹理相关的渲染属性

2、osg::StateAttribute类

StateAttribute() //默认构造函数
unsigned int getMember() const //虚函数。用于获取属性的成员号
bool getModeUsage(StateAttribute::ModeUsage &) const //虚函数。用于获取与属性绑定的渲染模式
int compare(const StateAttribute &) const //虚函数。用于比较两个渲染属性;这个函数可以用于两个渲染状态集的比较
const ParentList &getParents() const //获取属性的父对象列表,渲染属性的父对象是渲染状态集类型
void apply(State &) const //虚函数。应用这个渲染属性,可被派生类继承
void compileGLObjects(State &) const //虚函数。用于编译OpenGL对象,某些渲染属性(如纹理)需要预先进行编译
void releaseGLObjects(State *) const //虚函数。用于释放编译得到的OpenGL对象

使用StateSet::getAttribute()获取渲染属性时,可能出现一个渲染状态集包含了多个同类型属性的情况,此时可以使用成员号进一步区分。一个典型的例子是附加裁剪面glClipPlane的封装ClipPlane类:OpenGL中通常存在至多6个附加裁剪面,因此可能在同一个节点的渲染状态几种存在6个ClipPlane属性,分别包含了不同的裁剪平面参数,因此需要下面的代码来获取各个ClipPlane对象:

osg::ClipPlane *cp0 = dynamic_cast<osg::ClipPlane *>(stateSet->getAttribute(osg::StateAttribute::CLIPPLANE, 0));
osg::ClipPlane *cp1 = dynamic_cast<osg::ClipPlane *>(stateSet->getAttribute(osg::StateAttribute::CLIPPLANE, 1));
...

3、osg::Texture类

Texture() //默认构造函数
 //获取纹理S方向宽度、T方向高度,R方向深度
int getTextureWidth() const
int getTextureHeight() const
int getTextureDepth() const
//设置/获取纹理边界的颜色
void setBorderColor(const Vec4d &)
const Vec4d &getBorderColor() const
//设置/获取纹理边界的厚度
void setBorderWidth(GLint)
GLint getBorderWidth() const
//设置/获取纹理边界截取方式,其中which参数可以选择3个纹理坐标轴(WRAP_S/WRAP_T/WRAP_R),wrap参数可以选择CLAMP等多种边界截取方案
void setWrap(WrapParameter which, WrapMode wrap)
WrapMode getWrap(WrapParameter which) const
//设置/获取纹理滤波方式,其中which参数可以选择MIN_FILTER或MAG_FILTER,filter参数可以选择LINEAR等多种滤波方案
void setFilter(FilterParameter which, FilterMode filter)
FilterMode getFilter(FilterParameter which) const
//设置/获取是否自动转换纹理图片尺寸到2的幂次方
void setResizeNonPowerOfTwoHint(bool)
bool getResizeNonPowerOfTwoHint() const
//设置/获取纹理的内部压缩方式
void setInternalFormatMode(InternalFormatMode)
InternalFormatMode getInternalFormatMode() const
//设置纹理内部格式,仅在压缩方式为USE_USER_DEFINED_FORMAT时有效
void setInternalFormat(Glint)
GLint getInternalFormat() const
//设置/获取纹理图象源的数据格式
void setSourceFormat(GLenum)
GLenum getSourceFormat() const
//设置/获取纹理图象源的数据类型
void setSourceType(GLenum)
GLenum getSourceType() const
//虚函数。设置/获取某个面的纹理图像
void setImage(unsigned int face, Image *)
Image *getImage(unsigned int face)
//虚函数。获取已设置的纹理图像数目
unsigned int getNumImages() const

4、osg::Texture2D类

Texture2D() //默认构造函数
Texture2D(Image *image) //构造函数。以一个2D纹理的图片源作为输入参数
//设置/获取该2D纹理的输入图片源对象
void setImage(Image *image)
Image *getImage()
//设置2D纹理图像的大小
void setTextureWidth(int width)
void setTextureHeight(int height)


六 渲染属性类及作用

//实现Alpha测试:渲染属性类/类型
AlphaFunc
ALPHAFUNC
//指定颜色融合时的常量颜色:渲染属性类/类型
BlendColor
BLENDCOLOR
//指定颜色融合方程式:渲染属性类/类型
BlendEquation
BLENDEQUATION
//实现颜色融合的效果:渲染属性类/类型
BlendFunc
BLENDFUNC
//控制颜色截取的范围:渲染属性类/类型
ClampColor
CLAMPCOLOR
//实现视景体的裁切:渲染属性类/类型
ClipPlane
CLIPPLANE
//指定颜色缓存的写操作掩码:渲染属性类/类型
ColorMask
COLORMASK
//设置颜色矩阵:渲染属性类/类型
ColorMatrix
COLORMATRIX
//执行多边形的正/反面剔除:渲染属性类/类型
CullFace
CULLFACE
//实现深度测试:渲染属性类/类型
Depth
DEPTH
//指定雾效参数并实现雾效,几何图元设置的雾坐标参数可以由这个类予以生效:渲染属性类/类型
Fog
FOG
//实现GPU的片元编程功能:渲染属性类/类型
FragmentProgram
FRAGMENTPROGRAM
//实现FBO相关操作,包括渲染到纹理的功能:渲染属性类/类型
FrameBufferObject
0x101010
//指定绘制多边形正面时顶点的时针顺序:渲染属性类/类型
FrontFace
FRONTFACE
//实现图元的反走样处理:渲染属性类/类型
Hint
HINT
//指定光源的各种属性:渲染属性类/类型
Light
LIGHT
//选择光照模型,如全局光、双面光照等:渲染属性类/类型
LineModel
LINEMODEL
//实现自定义的线段填充花纹:渲染属性类/类型
LineStipple
LINESTIPPLE
//指定线宽:渲染属性类/类型
LineWidth
LINEWIDTH
//实现片元的逻辑运算:渲染属性类/类型
LogicOp
LOGICOP
//指定物体的材质参数,也可指定使用颜色材质模式:渲染属性类/类型
Material
MATERIAL
//实现多重采样效果:渲染属性类/类型
Multisample
MULTISAMPLE
//指定图元点的大小和亮度等参数:渲染属性类/类型
Point
POINT
//实现点精灵的效果,使用告示牌技术可用于创建高性能粒子系统:渲染属性类/类型
PointSprite
POINTSPRITE
//指定多边形的绘制模式,点/线框/填充:渲染属性类/类型
PolygonMode
POLYGONMODE
//实现多边形偏移以避免两表面重合时的斑驳问题:渲染属性类/类型
PolygonOffset
POLYGONOFFSET
//实现自定义的多边形填充花纹:渲染属性类/类型
PolygonStipple
POLYGONSTIPPLE
//实现GLSL着色器:渲染属性类/类型
Program
PROGRAM
//实现屏幕视图的裁剪:渲染属性类/类型
Scissor
SCISSOR
//指定图元顶点着色模式:渲染属性类/类型
ShadeModel
SHADEMODEL
//实现模板测试:渲染属性类/类型
Stencil
STENCIL
//实现正/反面的模板测试:渲染属性类/类型
StencilTwoSided
STENCIL
//用于指定纹理映射方式:渲染属性类/类型
TexEnv
TEXENV
//用于实现纹理映射效果的合并:渲染属性类/类型
TexEnvCombine
TEXENV
//用于调整纹理的细节层次LOD:渲染属性类/类型
TexEnvFilter
TEXENVFILTER
//用于自动生成纹理坐标:渲染属性类/类型
TexGen
TEXGEN
//设置纹理矩阵:渲染属性类/类型
TexMat
TEXMAT
//指定纹理滤波、截取等参数:渲染属性类 不能实例化
Texture
//实现一维纹理映射:渲染属性类/类型
Texture1D
TEXTURE
//实现二维纹理映射:渲染属性类/类型
Texture2D
TEXTURE
//实现二维纹理数组映射:渲染属性类/类型
Texture2DArray
TEXTURE
//实现三维纹理映射:渲染属性类/类型
Texture3D
TEXTURE
//实现立方图纹理映射:渲染属性类/类型
TextureCubeMap
TEXTURE
//实现矩形纹理映射:渲染属性类/类型
TextureRectangle
TEXTURE
//实现GPU的顶点编程功能:渲染属性类/类型
VertexProgram
VERTEXPROGRAM
//设置屏幕视图:渲染属性类/类型
Viewport
VIEWPORT

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013719339/article/details/80735796

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文