------------------------------------------------------------------------------------------------------------------------

从现在开始,认真学习OpenGL的相关知识,把读过的每一章都做记录,希望能坚持到最后。

------------------------------------------------------------------------------------------------------------------------

我从大家所熟知的”OpenGL红宝书“,即OpenGL编程指南第八版开始入手,该书已经结合了OpenGL4.3的新特性。

因为是看的是中文翻译版本,我打算和英文原版一起看,有时候确实是必须的,因为看英文更接近本质。

------------------------------------------------------------------------------------------------------------------------

坚持每一篇都写个例子,印象会更加深刻。好了,不说废话,开始了。

------------------------------------------------------------------------------------------------------------------------

【OpenGL背景】

OpenGL发展到现在,已经超过了20年的时间。作为一个成熟而久负盛名的跨平台的计算机图形应用程序接口规范,

它已经被广泛应用于游戏,影视,军事,航空航天,地理,医学,机械设计,以及各类科学数据可视化的领域。

另外,随着网络以及移动平台的崛起,WebGL以及OpenGL ES的标准也逐渐深入人心,这两者同OpenGL有着千丝万缕的联系。

OpenGL几乎支持所有现有的主流操作系统平台,包括Windows、Mac OS X以及各种UNIX平台。同时也可以用于几乎所有

主流的编程语言包括C/C++、Java、C#、VB、Python、Perl等。可以说OpenGL无处不在。而目前流行的游戏引擎cocos2d-x

底层的渲染即是采用了OpenGL技术,要理解以及修改引擎架构,就不可避免的要接触OpenGL,这也是我学习的一个方向。

------------------------------------------------------------------------------------------------------------------------

【什么是OpenGL】

OpenGLOpen Graphics Library,开放图形库。

OpenGL是图形硬件的一种软件接口(The OpenGL graphics system is a software interface to graphics hardware.),

即可以对图形硬件设备特性进行访问的软件库,方便我们开发交互式的三维计算机图形应用程序。

OpenGL被设计为与硬件无关的接口,因此它是跨平台的。那么我们就可以在不考虑操作系统的前提下,实现我们的OpenGL接口。

OpenGL自身并不包含任何执行窗口任务或者处理用户输入的函数,不过没关系,我们将会用到一个第三方跨平台的库

GLUT(OpenGL Utility Toolkit)来帮助我们处理这些窗口事件,关于它的内容接下来会介绍。

另外,OpenGL也没有提供任何用于表达三维物体模型(models of three-dimensional objects),

或者读取图像文件(例如JPEG文件)的操作。

取而代之,我们需要通过一系列的几何图元(包括点、线、三角形以及Patch)来创建三维空间的物体。

OpenGL是采用客户端-服务端的形式实现的,我们自己所编写的应用程序可以当做客户端,而计算机图形硬件厂商所

提供的OpenGL实现可以看做是服务端。(OpenGL is implemented as a client-server system,with the application

you write being considered the client, and the OpenGL implementation provided by the manufacturer

of your computer graphics hardware being the server.

OpenGL 是基于光栅化的系统(rasterization-based system),用于生成图像。但还有其他方法例如光线追踪

(ray tracing),但有可能也需要用到OpenGL来显示图像。

------------------------------------------------------------------------------------------------------------------------

【OpenGL程序渲染图像主要的操作】

1、为构建形状(Shape)指明(Specify)来自OpenGL的几何图元的数据。

2、使用不同的着色器(Shapes)对输入的图元数据执行计算操作,由此来判断它们的位置、颜色、以及其他渲染属性。

3、将输入图元的数学描述转换为在屏幕位置上相对应的片段(fragments)。这个过程称之为光栅化(Rasterization)。

4、最后,为每个经过光栅化阶段的片段执行片段着色器(fragment shader),该操作决定了片段的最终颜色以及位置。

5、有时可能需要对每个片段(per-fragment)执行一些额外的操作。

例如判断片段产生的对象是否可见,或者将片段的颜色和当前屏幕位置的颜色相融合。

------------------------------------------------------------------------------------------------------------------------

【理解常用的图形学名词】

渲染(Rendering):表示计算机从模型创建最终图像的过程。

模型(Model):或者又称为对象,是通过几何图元(geometric primitives)例如点(points)、线(lines)

和三角形(triangles)来构建的。而这些几何图元是通过顶点(vertices)来指明的。

着色器(Shaders):它是图形硬件设备所执行的一类特殊函数。

理解着色器的最好方法是把它看做专门为图形处理单元(GPU)编译的一种小型程序。

OpenGL在其内部包含了所有的编译器工具,可以直接从着色器代码创建GPU执行所需代码。

在OpenGL中,会用到四种不同的着色阶段(shader stages)。最常用的包括顶点着色器(vertex shaders)和

片段着色器(fragment shaders)。前者用于处理顶点数据(vertex data),后者用于处理光栅化后的片段数据。

像素(pixel):指的是显示器上最小的可视单元。在计算机系统中存储于帧缓存中。

帧缓存(framebuffer):由图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。

------------------------------------------------------------------------------------------------------------------------

【关于GLUT以及GLEW】 

你可能会经常在OpenGL程序代码中看到以glut开头的函数,他们来自第三方库OpenGL Utility Toolkit,就是我们所说的GLUT。

这是一个非常流行的跨平台工具库(cross-platform),可以用来显示窗口、管理用户输入,以及执行其他操作。

另外Freeglut是原始OpenGL库的一个新变种。

你也可能会看到类似glewInit()这样的函数,它来源于OpenGL Extension Wrangler,也就是GLEW

官网关于它的介绍如下:

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library.

GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform.

正如上文所说的,GLEW是一个跨平台的C++扩展库,基于OpenGL图形接口。GLEW能自动识别你的平台所支持的全部OpenGL高级扩展涵数。

------------------------------------------------------------------------------------------------------------------------

看了又写了这么多字,想必都有点迷糊了。

接下来就应该写写Hello OpenGL了。

2015.06.29

广州

【OpenGL】 第一篇 OpenGL概览的更多相关文章

  1. Servlet 2.4 规范之第一篇:概览

          写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还 ...

  2. [OpenGL红宝书]第一章 OpenGL概述

    第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...

  3. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    ​ ​本文是Spring Cloud专栏的第一篇文章,了解本篇文章内容有助于更好的理解后面文章 ​ 一.网站架构演变过程 1-1.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数 ...

  4. 第一篇 入门必备 (Android学习笔记)

    第一篇 入门必备 第1章 初识Android 第2章 搭建你的开发环境 第3章 创建第一个程序--HelloWorld 第4章 使用Android工具   ●Android之父 Android安迪·罗 ...

  5. 入住cnblogs第一篇随笔 Hello, world!

    在网上搜索计算机参考资料时经常看到各位大神的博客,甚是神往.今天我也在这里安家,记录自己的学习过程,也同各位共勉. 第一篇随笔,就用来测试一下这里的文本编辑器吧. //The C language # ...

  6. 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配

    简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...

  7. LWJGL3的内存管理,第一篇,基础知识

    LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...

  8. vue+uni-app商城实战 | 第一篇:【有来小店】微信小程序快速开发接入Spring Cloud OAuth2认证中心完成授权登录

    一. 前言 本篇通过实战来讲述如何使用uni-app快速进行商城微信小程序的开发以及小程序如何接入后台Spring Cloud微服务. 有来商城 youlai-mall 项目是一套全栈商城系统,技术栈 ...

  9. [OpenGL ES 02]OpenGL ES渲染管线与着色器

    [OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...

随机推荐

  1. C# 水印透明度图片

    /// <summary> /// 在一张图片的指定位置处加入一张具有水印效果的图片 /// </summary> /// <param name="Sourc ...

  2. 移动混合开发之android文件管理-->flexbox,webFont。

    增加操作栏,使用felxbox居中,felx相关参考网址:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 使用webFont添加图标, ...

  3. MVC 支持同名路由,不同命名空间

    有时候我们会碰到两个项目合在一起,那么必然会碰到两个同名的controller,其实MVC在注册路由,添加Route的时候可以指定当前规则解析那个命名空间下的所有Controller. 注:Contr ...

  4. android densityDpi 的由来

    ---恢复内容开始--- 今天做屏幕适配的时候,发现一个奇怪的现象: HTC D820u/ 红米Note/HONOR H30-L02 /Coolpad 8297-T01 4款手机的分辨率均为 1280 ...

  5. 几款Z2760平板对比

    现阶段的Windows平板本质上分为Windows RT系统平板和完整的Windows 8系统平板两大阵营.RT系统的平板轻薄续航持久,但是由于没法安装常规的.exe程序,所以对于工作需要略显不足,是 ...

  6. mybatis配置log4j显示sql语句

    log4j.properties文件下: log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4 ...

  7. linux下解压war文件命令

    jar -xvf project.war -->解压到当前目录下. -f  指定 JAR 文件名,通常这个参数是必须的 -v  显示过程信息

  8. Python为什么要self

    Python要self的理由 Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数 (self ),但在调用这个方法的时候不必为这个参数赋值 (显胜于隐 的引发). ...

  9. day05 java JDBC案例—Android小白的学习笔记

    1.要从键盘录入用户名与密码我们需要使用Scanner类完成操作 2.接收到用户名与密码后,我们需要调用jdbc程序根据用户名与密码查询数据库 User.java package com.superg ...

  10. win7右键在目录当前打开命令cmd窗口

    一般打开方式Windows+R 打开运行窗口输入CMD 在当前目录下打开CMD 按住Shift键+点击鼠标右键,会出现一个选项“在此处打开命令窗口”在右键快捷方式里.