当前位置: 首页 > news >正文

OGRE脚本解析流程分析--扫描阶段

Ogre的脚本解析分为以下步骤:

TOKEN化阶段

这个阶段主要是进行预处理,忽略空格并去掉注释,并将有用的脚本数据整理到ScriptTokenList结构中以供下阶段使用。

在OgreScriptLexer.cpp 中有一函数ScriptLexer::tokenize完成此功能。

这里有两个关键的数据结构

//Token结构

struct ScriptToken

{

  String lexeme;     //token内容

  String file;       //脚本文件名  

  uint32 type;       //token类型

  uint32 line;      //token所在文件行号

}

typedef SharedPtr<ScriptToken> ScriptTokenPtr;

//Token容器

typedef vector<ScriptTokenPtr>::type ScriptTokenList;

比如example.program中有如下数据

//example 脚本

vertex_program AmbientOneTexture cg

{

  source Example_Basic.cg

}

token化后,ScriptTokenList中每一个ScriptToken结构中的lexeme成员为如下数据:

"vertex_program",

"AmbientOneTexture",

"cg",

"{",

"source",

"Example_Basic.cg",

"}"

PARSE阶段  

token阶段只是将有用的数据存入ScriptTokenList,数据之间仅仅是线性平行关系。在PARSE阶段,Ogre将数据进一步处理,形成树状层次关系

还是先介绍该阶段的基本数据结构

struct ConcreteNode:public ScriptCompilerAlloc

{

  String token,file;

  unsigned int line;

  ConcreteNodeType type;

  ConcreteNodeList children;

  ConcreteNode* parent;

};

typedef SharedPtr<ConcreteNode> ConcreteNodePtr;

typedef list<ConcreteNodePtr>::type ConcreteNodeList;

很显然,PARSE阶段实质上就是生成ConcreteNodeList数据。

材质脚本解析

分析之前先简单介绍下材质脚本的结构。一个典型的material脚本如下:

material Core/NodeMaterial

{

  technique

  {

    pass

    {

      lighting off

      scene_blend add

      depth_check off

      depth_write off

      cull_hardware none

      texture_unit

      {

        texture axes.png

      }

    }

  }

}

可见,material是一个层次结构,一个material可以包含若干个technique,一个technique包含若干个pass,一个pass包含若干个texture,一个texture对应一张picture。

材质脚本解析器读取*.material文件,生成相应的Material对象,并读取其中的technique,pass,赋值给材质对象(Material)统一管理。所以,Ogre的Shader由材质对象(Material)管理。

解析material文件主要由两个函数完成:

void MaterialSerializer::parseScript(DataStreamPtr& stream,const String& groupName)

bool MaterialSerializer::parseScriptLine(String& line)

经过这两个函数的处理,系统就已经把material脚本读取并生成material对象,并添加到resourcegroup以备以后加载资源和渲染。注意,material中的材质单元在解析阶段默认是不会加载到显存中的。

转载于:https://www.cnblogs.com/billin/archive/2011/06/24/2089128.html

相关文章:

  • Sharepoint更新字段触发工作流(无代码)
  • 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
  • java集合
  • RDMA
  • oracle常用开发工具简介
  • numpy之随机数模块---random模块
  • 准备在博客园安家,在这里分享知识
  • glib 关系
  • Spark 1.1.0 安装测试 (分布式 Yarn-cluster模式)
  • 唐僧给悟空的信
  • JS 操作页面基础操作:禁止另存 防止复制 防止选择
  • [转] 浅谈 MVC3 WebMail 发送邮件
  • 检查android设备是否支持某些功能
  • View Controller 容器
  • 详解HTTP协议(二)
  • [PHP内核探索]PHP中的哈希表
  • AHK 中 = 和 == 等比较运算符的用法
  • chrome扩展demo1-小时钟
  • Javascript弹出层-初探
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • node入门
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Zsh 开发指南(第十四篇 文件读写)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 那些年我们用过的显示性能指标
  • 你真的知道 == 和 equals 的区别吗?
  • 如何利用MongoDB打造TOP榜小程序
  • 如何选择开源的机器学习框架?
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 设计模式(12)迭代器模式(讲解+应用)
  • 设计模式走一遍---观察者模式
  • 携程小程序初体验
  • 因为阿里,他们成了“杭漂”
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​香农与信息论三大定律
  • #控制台大学课堂点名问题_课堂随机点名
  • #预处理和函数的对比以及条件编译
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (三分钟)速览传统边缘检测算子
  • (转)EXC_BREAKPOINT僵尸错误
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET CF命令行调试器MDbg入门(一)
  • .NET CORE Aws S3 使用
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET成年了,然后呢?
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /var/lib/dpkg/lock 锁定问题
  • :not(:first-child)和:not(:last-child)的用法
  • :O)修改linux硬件时间