LearnOpenGL中文教程

Attention

由于网站的改版,本教程现在迁移至:https://learnopengl-cn.github.io/。 这个网站仍然会有无规律的更新,但是大体上是不再维护了。如果要阅读最新版本的教程,还请访问以上地址。

This site has been moved to https://learnopengl-cn.github.io/.

欢迎来到OpenGL的世界。这个工程只是我(JoeyDeVries)的一次小小的尝试,希望能够建立起一个完善的OpenGL教学平台。无论你学习OpenGL是为了学业,找工作,或仅仅是因为兴趣,这个网站都将能够教会你现代(Core-profile) OpenGL的基础,中级,以及高级知识。LearnOpenGL的目标是使用易于理解的形式,使用清晰的例子,展现现代OpenGL的所有知识点,与此同时为以后的学习提供有用的参考。

Image of smiling textured containers in OpenGL

在互联网上,关于学习OpenGL的有成千上万的文档与资源,然而其中大部分的资源仅仅讨论了OpenGL的立即渲染模式(Immediate Mode,通常会说旧OpenGL),亦或是不完整,缺少适当的文档,或仅仅不适合你的口味。所以我的目标是提供一个既完整,又易懂的平台供人们学习。

阅读全文

OpenGL ES, 初学者的自我总结

学习 OpenGL ES 一段时间了,深知这个过程的不容易

尤其是入门,OpenGL 到底好在哪里?什么是渲染管线?什么是状态机?纹理是不是就是图片?深度测试,模版测试又是什么鬼?…

OpenGL 有太多太多的东西需要学习。我最初接触 OpenGL,就是想借助它,实现美图秀秀里的一些功能。然而,不知道看了多少教程,实现了多少个旋转立方体,困惑了多少次,放弃了多少回…

慢慢地,似乎找到了一些门路…

于是,这系列的文章应运而生。

这系列文章主要是个人学习过程中的一些总结,因为本人也是初学者,所以会从初学者角度,介绍 OpenGL ES 图像处理最直接的一些知识。

利用 OpenGL ES,学习如何在 iOS 平台上进行图像处理,实现各种效果。

这,就是我想学到的,也是想分享给大家的。

PS:时间允许的话,希望能保证一个星期输出一篇文章,鞭策自己~

敬请期待

PS:这里将罗列个人学习过程中,认为好的一些书籍,教程,Demo等。

该系列的文章中,一些阐述,配图,可能是从其它文章或者书籍中摘录整理的。为保证阅读以及书写方便,这部分出处说明统一放到学习资料里。

本人也处于学习阶段,精力有限,难免引用前人优秀教程。如果对您造成不必要的麻烦,请及时告知。

OpenGL ES 2.0 API 快速参考卡片

红宝书:OpenGL Programming Guide

蓝宝书:OpenGL Superbible

阅读全文

OpenGL 图形库的使用(下)

我们在OpenGL中大量使用缓冲来储存数据已经有很长时间了。操作缓冲其实还有更有意思的方式,而且使用纹理将大量数据传入着色器也有更有趣的方法。这一节中,我们将讨论一些更有意思的缓冲函数,以及我们该如何使用纹理对象来储存大量的数据(纹理的部分还没有完成)。

OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地将其绑定到GL_ELEMENT_ARRAY_BUFFER。OpenGL内部会为每个目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。

到目前为止,我们一直是调用glBufferData函数来填充缓冲对象所管理的内存,这个函数会分配一块内存,并将数据添加到这块内存中。如果我们将它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充。这在我们需要预留(Reserve)特定大小的内存,之后回到这个缓冲一点一点填充的时候会很有用。

除了使用一次函数调用填充整个缓冲之外,我们也可以使用glBufferSubData,填充缓冲的特定区域。这个函数需要一个缓冲目标、一个偏移量、数据的大小和数据本身作为它的参数。这个函数不同的地方在于,我们可以提供一个偏移量,指定从何处开始填充这个缓冲。这能够让我们插入或者更新缓冲内存的某一部分。要注意的是,缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用glBufferData

阅读全文

OpenGL 图形库的使用(上)

OpenGL

OpenGL ES是一套多功能开放标准的用于嵌入系统的C-based的图形库,用于2D3D数据的可视化。OpenGL被设计用来转换一组图形调用功能到底层图形硬件(GPU),由GPU执行图形命令,用来实现复杂的图形操作和运算,从而能够高性能、高帧率利用GPU提供的2D3D绘制能力。

OpenGL ES规范本身不定义绘制表面和绘制窗口,因此ios为了使用它必须提供和创建一个OpenGL ES的呈现环境,创建和配置存储绘制命令结果的framebuffer 及创建和配置一个或多个呈现目标。在 iOS中使用EAGL提供的EAGLContext类 来实现和提供一个呈现环境,用来保持OpenGLES使用到的硬件状态。 EAGL是一个Objective-C API,提供使OpenGL ESCore AnimationUIKIT集成的接口。

在调用任何OpenGL ES 功能之前必须首先初始化一个EAGLContext 对象。每一个iOS应用的每一个线程都有一个当前context,在调用OpenGLES函数时,使用或改变此context中的状态。EAGLContext的类方法setCurrentContext:用来设置当前线程的当前contextEAGLContext 的类方法currentContext返回当前线程的当前context。在切换相同线程的两个上下文之前,必须调用glFlush函数来确保先前已提交的命令被提交到图形硬件中。

阅读全文

OpenGL ES入门

实现效果图

1、建立项目,创建OpenGLESView

2、初始化OpenGLES上下文

3、创建帧缓存和渲染缓存,并进行绑定

帧缓存附件:

函数:

分配n个未使用的帧缓存对象,并将它存储到framebuffers中。

glGenFramebuffers (GLsizei n, GLuint* framebuffers)

设置一个可读可写的帧缓存。当第一次来绑定某个帧缓存的时候,它会分配这个对象的存储空间并初始化,此后再调用这个函数的时候会将指定的帧缓存对象绑定为当前的激活状态。

glBindFramebuffer (GLenum target, GLuint framebuffer)

glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)

判断是否是程序生成的帧缓存对象,如果是返回GL_TRUE。如果为0或者未分配返回GL_FALSE。

glIsFramebuffer (GLuint framebuffer)

释放帧缓存对象

glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers)

glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)

创建并绑定渲染缓存。当第一次来绑定某个渲染缓存的时候,它会分配这个对象的存储空间并初始化,此后再调用这个函数的时候会将指定的渲染缓存对象绑定为当前的激活状态。

glBindRenderbuffer (GLenum target, GLuint renderbuffer)

glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)

判断是否是程序生成的渲染缓存,如果是返回GL_TRUE。如果为0或者未分配返回GL_FALSE。

glIsRenderbuffer(GLuint renderbuffer)

释放渲染缓存

4、清屏并进行相关绘制

5、清理缓存

阅读全文