• OpenGL-状态机 理解


    1. 状态机

     状态机:
     	1.它有记忆的能力,能够记住自己当前的状态
     	2.它可以接收输入,根据输入的内容和自己的状态,修改自己的状态,
     		并且可以得到输出。
     	3. 当它进入某个特殊的状态的时候,它不再接收输入,停止工作。
     	
    
    理解电脑成为状态机:
    	1. 电脑的存储器,可以记住电脑自己当前的状态。
    	2. 电脑的输入设备接收输入,根据输入的内容和自己的状态,修改自己的状态,并
    	    且可以得到输出。
    	3. 当它进入某个特殊的状态的时候,它不再接收输入,停止工作。
    
    OpenGL 理解为状态机:
    	1. OpenGL 可以记录自己状态。(比如使用的颜色、开启混合功能)
    	2. OpenGL可以接收输入,根据输入的内容和自己的状态,修改自己的状态,并且
    		可以得到输出。
    	3. OpenGL 可以进入停止状态,不再接收输入
    
    OpenGL 是一个状态机,它保持自身的状态,除非用户输入一条命令让它改变状态。
    通过glEnable 来启用转台,通过glDisable 来禁用它们。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    // 我们通过 glEnable 来启用状态
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    可以用glIsEnabled 函数来检测这些状态是否被开启
    
    • 1
    glIsEnabled(GL_DEPTH_TEST);
    glIsEnabled(GL_BLEND);
    glIsEnabled(GL_CULL_FACE);
    glIsEnabled(GL_LIGHTING);
    glIsEnabled(GL_TEXTURE_2D);
    // 如果状态是开启的,则glIsEnabled 函数返回 GL_TRUE 否则返回 GL_FALSE
    
    
    if(glIsEnabled(GL_BLEND))
    {
    	// 当前开启了 混合功能
    }
    else
    {
    	// 当前没有开启混合功能
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    OpenGL 提供四个函数 把状态值 存放到 指针所指向的位置
    glGetBooleanv, glGetIntegerv, glGetFloatv, glGetDoublev
    
    • 1
    • 2
    // 取得当前的直线宽度
    GLfloat lw;
    glGetFloatv(GL_LINE_WIDTH,&lw);
    // 取得当前的颜色
    GLfloat cc[4];
    glGetFloatv(GL_CURRENT_COLOR,cc);
    //取得当前的视口
    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT,viewport);
    // 注意元素的个数,比如GL_LINE_WIDTH 状态只有一个值,而GL_CURRENT_COLOR有四个值, 注意变量或数组,避免下标越界
    // 使用四个不同的函数,同一状态也可以返回不同类型的值,比如要获得当前的颜色,一般返回GLfloat 类型或者 GLdouble
    GLfloat cc[4];
    GLdouble dcc[4];
    glGetFloatv(GL_CURRENT_COLOR,cc);
    glGetDoublev(GL_CURRENT_COLOR,dcc);
    
    //  一些状态不便于使用上述四个函数取得,比如光源的状态,因此专门提供了 glGetLight* 系列函数 取得光源的状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    OpenGL 设置状态
    OpenGL 提供大量的函数来设置状态:glColor*, glMaterial*,glEnable, glDisable,大多
    数OpenGL 函数都是用来设置 OpenGL 状态的。
    
    • 1
    • 2
    • 3

    2. OpenGL 工作流程

    流程如图:
    
    • 1

    OpenGL工作流程

    	说明:
    		1. Vertex data: 顶点数据。比如 指定的颜色、 纹理坐标、法线向量、顶点坐标
    			等都属于顶点数据。
    		2. Pixel data: 像素数据。我们在绘制像素、指定纹理时都会用到像素数据。
    		3. Display list: 显示列表。可以将调用OpenGL函数保存起来
    		4. Evaluators: 求值器。可以指定贝塞尔曲线或者贝塞尔曲面,可以理解为指定
    			顶点、纹理坐标、指定法线向量等
    		5. Per-vertex operations and primitive assembly: 单一的顶点操作以及图元装
    			配。首先 对单一顶点进行操作,比如变换, 然后把顶点装配为图元(绘制简
    			单的图形)
    		6. Pixel operations: 像素操作。例如把内存中的像素数据格式转化为图形硬件所
    			支持的数据格式。对于纹理,可以替换其中的一部分像素,这也属于像素操
    			作。
    		7. . Rasterization: 光栅化。顶点数据和像素数据在这里交汇,形成完整的、可以
    			显示的一整块。里面包含若干个像素。这一整块被称为 fragment(片段)
    		8.  Per-fragment operations: 片段操作。包括各种片段测试
    		9. Framebuffer: 帧缓冲。这是一块存储空间,显示设备从这里读取数据,然后显
    		    示到屏幕。
    		10. . Texture assembly: 纹理装配。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    2022编译原理期末考试 回忆版
    6条优势,anzo capital昂首资本相信MT5替代MT4的原因
    Vite: 新一代高效的前端构建工具
    ppt模版免费下载网站大全
    数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景
    代码随想录算法训练营Day61|单调栈02
    python中的列表
    大整数加法
    linux早期内存管理:memblock完全介绍
    一文带你学透Java Servlet(建议收藏)
  • 原文地址:https://blog.csdn.net/weixin_45054115/article/details/126794120