仅为开发爱好者提供一些浅见,转载请注明出处。

  章节

  1. Introduction (介绍)

  2. Design decisions(一些设计的选择)

  3. Class Overview (类介绍)

  3. Components Design (模块设计)

  5. Discusstion (相关的问题)

  Introduction

  Shader,又称着色器,是可编程的,相比过去在显卡上通过硬件hardcode流水线的方式,Shader提供了更灵活有效的解决方案,为新一代的显卡所支持,而在图形引擎中弃用固定流水线编程方式是大势所趋。对于刚刚接触Shader的同学,如何接受这种编程方式的迁移呢?回忆一下主板上BIOS程序,当我们要设置主机是从光盘优先启动还是硬盘优先启动的时候要用到它,配置好的启动信息是保存在主板的CMOS上的。固定管道编程就类似于此,只是对显卡上烧制好的一些算法做一些配置,而Shader的方式则可以使用自己Shader Program去替换部分流水线,把更大图形渲染能力释放出来了。

  Shader Program是载入到显卡中执行的一段汇编指令(assemble instruction),使用固定管线的时候,不需要知道它的算法只需要做一些配置就行了;而使用Shader之后,像光照模型这样的简单公式都得自己写了,所以说能力越大,责任也越大。在渲染系统(render system)中Shader Progrom应被做为一种资源(resource)管理和使用。类似于图片(image)的地位一样,一张图片能为多个物体贴图,一个shader program同样也可以被多个渲染效果(effect)所分享。

  在进行图形渲染时,如果显卡中已经载入了对应的shader,便可以直接使用,比如说在DirectX中,就意味着获得了一个有效的IDirect3DVertexShader9或者IDirect3DPixelShader9的COM接口。如果没有的话,检查内存中是不是已经从磁盘载入。如果也没有,则在磁盘中检查是否有Shader Progrom的文件,如果磁盘中也没有,就提供一个默认的shader。

  Shader System,作为图形引擎的渲染系统(render system)一部分的,需要实现对Shader Program在磁盘(disk), 内存(System memory), 显存(VRAM) 的3个存储层级的管理,从而为渲染提供一个高效简洁的接口。

  Design Decisions

  1. Shader Progarm的资源类型

  在Disk上的Shader Program可以是使用Shader language高级语言像Cg, HLSL写的源程序,也可以是预编译好的汇编代码。 从资源的角度来看,汇编代码的使用效率更高,做到一段小的代码实现一段独立的shader,同时为了考虑以后实现Shader Program的自动拼接,我目前选择的是存储汇编代码。

  2. 词法分析和语法分析的方式

  从汇编代码中可以看到,它用到了很多已经设置好了值的寄存器。是的,这些寄存器的值是在调用代码前,就已经设置好了。比如说顶点Shader的位置变换矩阵,每一次摄像机的移动都会引起变化。设置Shader外部变量用到的寄存器的值,必须对汇编代码进行词法分析和语法分析,才能知道各个寄存器应该存储什么变量。最易扩展的方式是使用编译工具进行分析,也可以简单写一个字符串处理程序进行语法分析。我目前选择的是自己实现字符串处理。

  Class Overview

  通过下面的类图简要地介绍下类设计框架。从左边起,Effect表示一个完整的渲染效果,一个效果可能需要几次的流水线(pass),所以它包括了多对的VertexShader和PixelShader,其中每对实现一个pass。

  往右看,每个Shader都要用到一段Shader Program,这是渲染系统中的核心资源。Program上面是Catalogs,在Introduction中说过Program是一种可被共享的资源。如果共享呢?通过Catalogs以Program的名字为索引,来找到这个Program,如果找不到则试图从磁盘载入。

  在Program的下方,描述了一个Program的属性,有许多的ShaderExternals,每个表示需要填入的寄存器的位置和内容,有两个Attributes,分别存储这个Program的输入和输出,另外ResourceID表示对应显卡中Shader的资源接口,如果为空,则试图重新创建。通过这样管理磁盘,内存和显卡三处的资源。

Figure 1 Class Overview of Shader System

  Component Desgin

  通过下面的VertexShader使用的序列图(已作简化)说明一下Shader的应用。从Render的角度看,分为两个阶段:Load和Enable。第一,Load的过程首先是将Program的Assemeble text进行处理后载入到显卡中,在D3D中调用Device的CreateVertexShader接口。这里如果通过Catalog的Find方法发现Shader已经装载到了VRAM中,这时候这一帧就不需要再去装载Shader了。第二,Enable的过程是首先是为指定渲染用到的shader,然后设置寄存器的值,在Shader的Asssemble text中已经指定了哪些寄存器应该存储什么内容,比如说世界变换矩阵,比如说Material。在D3D中通过Device的SetVertexShaderConstantF来指定。这样Shader就应用到渲染顶点上了。

Figure 2 Load and Enable Vertex Shader

游戏图形引擎中 Shader Systen 的设计相关推荐

  1. 游戏行业中3D设计都有哪些职位?3D场景建模该如何学习?

    游戏行业中的3D美术设计呢,分为场景设计,以及角色设计. 3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计 ...

  2. 浅谈游戏视觉包装中的“情感化设计”

    在目前的互联网设计中,情感化设计越来越多被人所提及.随着科学技术的发展,使得用户对产品满足人的心理需求方面提出了更高的要求,在目前的社会发展环境下,设计师也已经不能仅仅只是沉醉在酷炫的视觉效果,更多的 ...

  3. 玩家为何沉迷于游戏?《密教模拟器》中的“上瘾体验”设计

    最近又沉迷了一款名为<密教模拟器>的游戏,其实类似的上瘾体验,我也曾在数款游戏中产生过.针对这种"上瘾体验"我有过很多深入的思考,本文主要讲述我对上瘾设计的一些思考,以 ...

  4. 关于游戏中仓库类的设计

    前言 这个游戏中的仓库类设计开始于春节前,和大家一样,我也是期盼着放假而无心工作,所以在放假前一天虽然蹦出了思维的火花,我却没有使用文字记录下来,但是大致的思路我已经记录到脑子中了,这一次的突然感悟, ...

  5. 游戏中的人工智能AI设计

    因为在现在的项目中花了很大精力设计和制作怪物AI和技能,所以在这里也做个小总结. 什么叫做游戏中的AI        游戏中的AI可以简单的理解为计算机控制的智能角色,这些智能角色能够通过周遭环境或者 ...

  6. 游戏中掉落系统的设计

    我们在游戏中会采用不同的随机方式.而玩家感觉起来像随机的事件其实也不完全是按随机事件来设计的.下面我们来谈谈这些做法. 1.计数随机 在早期游戏中,有些道具的掉落是和怪物被击杀的次数相关的,通常在成千 ...

  7. 中职计算机教学游戏化,中职美术游戏化学习的设计与应用研究

    原标题:中职美术游戏化学习的设计与应用研究 中职美术游戏化学习的设计与应用研究 [摘 要]在当前的教育教学中将游戏引入课堂早已不再是新鲜事,随着新课程教学改革的深入发展,教学方法和策略不断创新,各种新 ...

  8. 游戏脚本在移动游戏设计中的作用_关卡设计师谈游戏中的敌对角色设计Monster Design...

    原作者:Emil Glans 关卡设计是一门非常广泛的学科,不仅涵盖了基础几何学.脚本中的事件&敌人设计,还涉及到不同部分的组合.紧张度调节和叙事.在本文中,我将重点讨论一些与核心游戏设计密切 ...

  9. 【翻译搬运】起源引擎 C/S延迟补偿方法在游戏协议中的设计与优化【一】

    写在前面 继翻译搬运起源引擎(Source)的客户端服务器同步之后,搬运了这篇 Latency Compensating Methods in Client/Server In-game Protoc ...

  10. 游戏设计之我见 —— 动作游戏中的敌人移动设计

    这篇博客结合了一些游戏案例,介绍了在3D动作游戏中常用的AI移动规律的设计. 移动方向 在3D游戏中,所有的物件都是以"横·纵·高"三个轴为基础进行移动. 但是对于动作游戏来讲,如 ...

最新文章

  1. 读郭老师推荐书籍--《原则》
  2. VS.NET 2003 安装问题
  3. “捆绑”住用户,需要优秀的产品(经验分享)
  4. .NetCore 3.1 安装本地化中文智能提示
  5. sentinel 端口_双剑合璧Nacos结合Sentinel实现流量安全控制(一):Sentinel核心库和控制台...
  6. 如何招到优秀的程序员(第二版)
  7. Sklearn——Sklearn的介绍与安装
  8. ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?
  9. c语言 库仑计_android电池(四):电池 电量计(MAX17040)驱动分析篇【转】
  10. 技术美术 之 游戏开发流程
  11. 不能创建对象qmdispatch_关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法...
  12. 使用Java实现多个文件压缩打包
  13. 软件测试面试两分钟自我介绍
  14. 商务网站建设与维护【9】
  15. 7-7 图像抽丝 (10分)
  16. 超级码力在线编程大赛初赛 第2场 T1-T4题解
  17. PHP分析谷歌财经数据
  18. 深入理解计算机系统(CSAPP) 第二章
  19. 区块链技术加持,腾讯安全助推上海“易盾计划”数字版权保护工作
  20. 水利水电安全员考试单选练习题库(7)

热门文章

  1. 水电缴费系统php源码_水电缴费管理系统(示例代码)
  2. selenium下载或保存图片最好的方法
  3. 加密 CryptoJS DES
  4. c语言串口调试助手源码,串口调试工具 1.02 (软件 + 源码)
  5. 华为HCIE云计算培训笔记第一天
  6. 2023南京工业大学计算机考研信息汇总
  7. (图文)最详细的XAMPP的安装及使用教程
  8. matlab 带积分的方程,在Matlab中实现积分方程的迭代解
  9. 惠威D1080带来精致听音感受
  10. 第四期_Metasploit 基础(二)MSFconsole《Metasploit Unleashed Simplified Chinese version(Metasploit官方文档教程中文版)》