• OpenGL的一些基础概念


    一、什么是OpenGL
      
      OpenGL是一个图形API,包含了一系列的可以操作图形、图像的函数。它并不是一个独立的平台,需要使用一个编程语言来工作,最常见的就是使用C++。然而,更严格的定义来讲,OpenGL应该是指一套规范。
     
    二、OpenGL的一些基础概念
     
    1、核心模式与立即渲染模式
      早期的OpenGL使用的是立即渲染模式(固定渲染管线),OpenGL的大多数功能都被库隐藏起来,基于OpenGL的开发者很难去控制计算的自由。虽然在立即渲染模式下,图形的绘制很方便。
    但是从3.2版本开始,就开始废弃立即渲染模式了,推出了核心模式,这个模式完全移除了旧的特性。 
      当使用OpenGL的核心模式时,OpenGL迫使开发者去使用现代函数。虽有难度,但更灵活,效率更高,更重要的是可以更深入的理解图形编程。
     
    2、扩展
      OpenGL的一个比较重要的特性就是对扩展的支持。 当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
     
    3、状态机
       OpenGL本身就是一个巨大的状态机:一系列的变量描述此时的OpenGL如何运行。其状态通常被称为上下文(context)。一般使用设置选项、操作缓冲来更改OpenGL的状态。最后使用当前的OpenGL上下文来渲染。
     
    4、对象
      OpenGL是用C语言编写的,同时支持多语言的派生,但内核仍然是C库。由于C语言不容易被翻译到其它高级语言,因此OpenGL开发过程中,引入了一个抽象层。“对象”就是其中一个。在OpenGL中的对象指的是一些选项的集合,代表OpenGL状态的一个子集。可以把对象看作是一个C风格的结构体(struct),如下代码块所示:
    1 struct object_name{ 
    2     GLfloat option1;
    3     GLuint option2;
    4     GLchar[] name;
    5 };
      特别注意:基元类型
      使用OpenGL时,建议使用OpenGL定义的基元类型。比如使用float时我们加上前缀GL(因此写作GLfloat)。int、uint、char、bool等等也类似。OpenGL定义的这些GL基元类型的内存布局是与平台无关的,而int等基元类型在不同操作系统上可能有不同                 的内存布局。使用GL基元类型可以保证你的程序在不同的平台上工作一致。
     
      当我们使用一个对象时,大致如下:
    1 // OpenGL的状态 
    2 struct OpenGL_Context { 
    3     ... 
    4     object* object_Window_Target; 
    5     ... 
    6 };
      OpenGL常见的工作流:
     1 // 创建对象 
     2 GLuint objectId = 0; 
     3 glGenObject(1, &objectId); 
     4  
     5 // 绑定对象至上下文 
     6 glBindObject(GL_WINDOW_TARGET, objectId); 
     7  
     8 // 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项 
     9 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); 
    10 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); 
    11  
    12 // 将上下文对象设回默认 
    13 glBindObject(GL_WINDOW_TARGET, 0);

      使用对象的一个好处就是,在程序中不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的选项。 执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。

  • 相关阅读:
    toolbar: '#tbSuppliers', 在上面, toolbar: 'tbSuppliers',在下面
    .net出现80080005错误的解决办法
    The expression of type List needs unchecked conversion to conform to
    我天性不宜交际
    一些资料
    $.connection.hub.start().done(function () { alert('signalR started'); }).fail
    使用 Web Notifications
    JS获取几种URL地址的方法
    随机生成汉字、字母、数字的方法
    linq剔除重复项
  • 原文地址:https://www.cnblogs.com/getMyCodes/p/13529763.html
Copyright © 2020-2023  润新知