小强学渲染之OpenGL状态机理解
状态机是理论上的一种机器,呃这个说法非常非常的抽象。通俗一点理解,状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动。或者说,状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应。因此具有以下特点:
1.有记忆功能,能记住其当前的状态;
2.可以接收输入,根据输入的内容和自己的原先状态,修改自己当前状态,并且可以有对应输出;
3.当进入特殊状态(停机状态)的时候,变不再接收输入,停止工作;
虽然还是很抽象,但结合实例理解就容易明白了,如身边的电脑,就是一典型的状态机,对照理解如下:
1. 电脑的存储器(内存、硬盘等),可以记住电脑自己当前的状态(如保存在电脑中的数据,即二进制的值,都属于当前的状态);
2. 电脑的输入设备接收输入(键盘和鼠标输入等),根据输入的内容和自己的状态,修改自己的状态(修改内存中的值),并且可以得到输出(将结果显示到屏幕)。
3. 当进入关机状态的时候,它不再接收输入,停止工作。
同理,OpenGL也可以类似这样的理解:
1. OpenGL可以记录自己的状态(如当前所使用的颜色、是否开启了混合功能等);
2. OpenGL可以接收输入(当调用OpenGL函数的时候,实际上可以看成OpenGL在接收我们的输入),如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;
3. OpenGL可以进入停止状态,不再接收输入。在程序退出前,OpenGL总会先停止工作的。
可通过一些OpenGL函数来获取OpenGL的当前状态,如下:
1)glEnable启用状态,而glDisable来禁用它们。例如:
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
2)glIsEnabled函数检测这些状态是否被开启。例如:
glIsEnabled(GL_BLEND);
如果状态是开启的,则glIsEnabled函数返回GL_TRUE(宏定义为1);否则返回GL_FALSE。
设置OpenGL状态
既然有getXXX这样的函数来取得OpenGL的状态,那么为什么没有setXXX这样的函数来设置OpenGL状态呢?
因为OpenGL已经提供了大量的函数来设置状态了:glColor*, glMaterial*, glEnable, glDisable, 等等,大多数OpenGL函数都是用来设置OpenGL状态的,因此不需要再设计一个setXXX函数来设置OpenGL状态。
从“状态机”的角度来看。状态机根据输入来修改自己的状态,而不是由外界直接修改自己的状态。所以不设置setXXX这样的函数,也是很合理的。
以上的笔记是我之前浏览某位同学写的不错的关于对OpenGL状态机的帖子,抽取出来加深理解。该帖子还有不少例子大家可以看看https://www.cnblogs.com/Anita9002/p/4415239.html
小强学渲染之OpenGL状态机理解的更多相关文章
- 小强学渲染之OpenGL的CPU管线
		
读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...
 - 小强学渲染之OpenGL渲染管线详析
		
什么是OpenGL? OpenGL是一套图形硬件的软件API接口库,它直接和GPU交互,将3D场景渲染绘制到2D屏幕上.总结说,OpenGL的功能是将程序中定义的各种2D或3D模型绘制到帧缓存中,或者 ...
 - 小强学渲染之OpenGL的GPU管线
		
GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段.GPU管线涵盖了渲染流程的 几何阶段 和 光栅化阶段,但对开发者而言,只有对顶点和片段着色器有可编程控制权,其他 ...
 - 小强学渲染之Unity Shader噪声应用
		
之前玩Tencent的仙剑4手游时,杀死boss会看到boss有“消融”的效果,就是身体上有多个洞洞然后往四周扩散直至尸体完全消失,但效果是没有关闭背面剔除的“穿帮”效果,可能也是考虑性能因素. em ...
 - 小强学渲染之Unity Shader边缘描边加强
		
项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...
 - 小强学渲染之Unity Shader编程HelloWorld
		
第一个简单的顶点vert/片元frag着色器 1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...
 - 解决初学者学不懂android,不理解android的设计
		
最近在忙着搞一个小项目,所以没有来得及写一些原创性的东西,好容易今天中秋节,就趁现在写一些吧,今天仍然看了些老马的视频,尽管这些东西以前都用过,但是感觉仍然学到了不少东西,说给大家听希望大家也要不要不 ...
 - 用一颗学美术的心来理解PID调节
		
用一颗学美术的心来理解PID调节 泡利 3 个月前 相信大家小时候都画过美术作品吧?(什么?你还是宝宝?)没关系,不管你是文科.理科.工科.艺术还是家里蹲的,这篇文章对你来说一定会简单到爆炸的. 这种 ...
 - 把Android原生的View渲染到OpenGL Texture
		
http://blog.csdn.net/u010949962/article/details/41865777 最近要把Android 原生的View渲染到OpenGL GLSurfaceView中 ...
 
随机推荐
- ubuntu 菜单栏和终端都消失了,鼠标也成了一个×  解决办法!!!
			
办法1: ctrl+alt+f1 进入命令模式 依次下载 sudo apt-get update sudo apt-get install --reinstall ubuntu-desktop su ...
 - jQuery 点击后退(返回)执行函数
			
<html> <head> <meta charset="UTF-8"> <meta name="viewport" ...
 - Django 小饭桌项目实战笔记
			
gulp-sass安装 安装报错,原因未设置全局镜像源npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ ...
 - centos7以rpm方法装mysql5.7及大坑
			
环境: CentOS Linux release 7.5.1804 (Core) Mysql版本: MySQL-5.7.17-1.el6.x86_64.rpm-bundle.tar 下载地址( ...
 - 第一章 C#入门(Windows窗体应用程序)(二)
			
C#窗体应用程序(二) [案例]设计登录界面,效果如下: [案例实现步骤] 1.新建项目(Windows控制台应用程序 文件→新建→项目:选择“项目类型”为Visual C#,“模板”为Windows ...
 - myibatis的坑--text类型的字段查询缺失
			
问题:某个字段的类型为text(或者mediumtext,longtext)的时候,用selectByQuery语句查询出来的结果不包含该字段内容. myibatis 用mybatis-generat ...
 - docker镜像制作 centos6 nginx1.15.6 with NGINX_UPSYNC_MODULE
			
首先我选择了在centos6里部署nginx的镜像,如果大家选择的是centos7,自己重新修改吧 这里的问题点有几个: 1,make的版本选择,因为我下载了最新的cmake,需要c++11编译 这玩 ...
 - pyhton3.5将汉字转成二进制的方法
			
直接上代码:name = "你好,中国人"byteName = bytes(name.encode("utf-8"))print(byteName)for b ...
 - 使用docker查看jvm状态,在docker中使用jmap,jstat
			
Docker中查看JVM的信息: 1. 列出docker容器:docker ps 2. 标准输入和关联终端:docker exec -it 容器ID bash 3. 查找出j ...
 - 云存储的未来:Scale Up还是Scale Out?
			
云存储的几十年发展历程,其计算架构模型,也从Scale Up走向Scale Out.但是展望未来数字世界的海量需求,目前流行的模型还能够持续满足吗?本文通过对云存储历史的回顾,及对Scale Up ...