
OpenGL 从入门到起飞
文章平均质量分 62
主要介绍OpenGL的基础知识,以及一些常规效果的实现。
松阳
我在路上走着,遇到了你,大家点头微笑,结伴一程
缘深缘浅,缘聚缘散,该分手时分手,该重逢时重逢
惜缘即可,不必攀缘
同路人而已
能不远不近地彼此陪伴着,不是已经很好了吗?
展开
-
OpenGL(二十) 投影 的shader实现
简单说来 投影 是将一个纹理贴到另一个模型或图片上的技术。在现实生活中,皮影戏就是根据这个原理产生的。原理参照皮影戏,我们需要一个投射器,一个采样图和一个成像模型。这样一想,跟OpenGL(十九)阴影 通过ShadowMap的shader实现中提到的投影模型是差不多的。不同之处在于,不需要采集深度图,当进行到第二步时,也不需要比较深度。而是直接取出采样图中texcoord对应的颜色进行混合。实现依...原创 2018-02-10 11:00:37 · 1593 阅读 · 0 评论 -
OpenGL(十九) 阴影 通过ShadowMap的shader实现
阴影 可以使角色与地面的关系更加明确。本文主要介绍如何通过 ShadowMap 在OpenGL中实现 阴影 。核心原理Shadow Map的基本思想:通过LightView画一张DepthMap,然后Camera View渲场景的时候,把Pixel坐标变换到Light Space,比较Depth即可(Pixel的Depth大于Shadow Map的Depth即在阴影区)。也可以直接是ScreenS...原创 2018-02-10 10:57:14 · 2628 阅读 · 0 评论 -
OpenGL(十八)Gamma校正 色域 与 HDR
通常来说,在不同设备上看到的颜色是不同的。其中最常提及的概念是高动态光照渲染(High-Dynamic Range,简称 HDR )。它可以使图像在亮度的表现上更丰富。这篇文章讨论设备颜色和校正的相关概念。眼前的黑不是黑人眼对亮度的敏感程度不是线性的,因此我们我们更容易看到亮的区域。上图中左侧是线性渐变的图,右侧是我们实际看到的。在显示器上,输入线性信号就会显示出右图的效果。为了解决这个问题,在显...原创 2018-02-10 10:52:41 · 7079 阅读 · 0 评论 -
OpenGL(十七)Photoshop blend算法 与 图层混合模式
使用混合模式可以制作丰富多彩的效果。而OpenGL中可以轻松开启这种模式,但更关键的是图形算法。本文参照 Photoshop blend算法 ,介绍如何通过shader,在OpenGL中实现混合效果。OpenGL中开启混合在OpenGL中可以开启混合模式:glEnable( GL_BLEND ); // 启用混合glDisable( GL_BLEND ); // 禁用关闭混合统一说法,参...原创 2018-02-10 10:47:58 · 5284 阅读 · 0 评论 -
OpenGL(十六)通过 卷积 实现: 边缘混合 、 Blur 和 高斯模糊
卷积卷积 (Convolution)是两个变量在某范围内相乘后求和的结果。卷积计算通常用来处理边缘的颜色或整体的混色。作为采样之后的处理,可以供很多功能使用。因此在图像效果处理时,它还是应用比较广泛的。区域缩暗通过最简单的像素采样,可以将图片中整体的锐利度降低,通过在一个3x3的区域取颜色,并取出区域中的最小色值,可以实现整体变暗,并且边界会像内缩一段距离。void main(){ ve原创 2018-02-05 19:59:33 · 9425 阅读 · 1 评论 -
OpenGL(十五)雾效 的 shader 实现
雾效 可以表现出一个线性的颜色变化,常用于烘托场景气氛。这种效果的实现原理并不复杂,本文着重讨论如何通过shader编写完成雾效的实现。核心原理雾效 的核心在于:计算视点与物体之间的距离,然后根据一个衰减公式进行颜色混合。常规的算法有线性衰减,指数衰减,指数幂衰减。线性雾效使用线性差值衰减,即可达到这种 雾效 。示意图如下:对应shader如下://vsvarying vec3 V_Normal原创 2018-01-29 18:05:00 · 4252 阅读 · 0 评论 -
OpenGL(十四)环境反射 环境折射 的shader实现
在上一节我们讲解了如何制作天空盒,本篇文章介绍它的一个衍生功能——在物体上叠加 环境反射 。核心原理核心很简单,在天空盒中,视线照射到天空盒上的区域即需要绘制的部分。在环境反射中,需要绘制的区域变成了视线在物体表面的反射光线,反射光线照射到天空盒的位置即要绘制的部分。环境反射按照上面的说法,将法线方向传入shader中,具体编写如下://vsattribute vec3 pos;attribu原创 2018-01-22 13:41:53 · 2180 阅读 · 0 评论 -
OpenGL(十三) 天空盒 的 shader 实现
天空盒 的使用可以使用户感觉所处一个封闭的世界环境,使得游戏更加真实。本文主要介绍如何通过OpenGL和GLSL来实现天空盒。天空盒 的核心原理其实并不复杂,它相当于在视线外套上一个盒子。盒子有6个面,分别使用6张可以拼接在一起的图片。从原理上讲,通过比较视线的xyz,可以找到方向...原创 2017-06-19 15:05:23 · 6575 阅读 · 0 评论 -
OpenGL(十二) 光源类型 平行光 、 点光源 、 聚光灯 的实现
常规的 光源类型 有三种。最简单的自然是平行光。稍复杂些的为点光源,最复杂的为聚光灯。总体说来,在可编程管线中原理是一样的。在OpenGL代码中传入必要的参数,在shader中进行相关的计算绘制出效果。本文分别介绍三种效果的shader实现。原创 2017-05-17 10:49:25 · 9739 阅读 · 0 评论 -
OpenGL(十一) 可编程管线 基础光照 的实现
在OpenGL中创建 基础光照 ,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中。另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死...原创 2017-05-02 15:01:00 · 3341 阅读 · 0 评论 -
OpenGL(十) 手机不可用特性 ComputeShader GeometryShader ...
由于当前市场上还存在大量低端Android机器,它们只支持到OpenGL ES2.0,因此 手机不可用特性 有很多。对于一些3.0 甚至4.0的特性,只能看看热闹了。当然基本了解还是需要的,万一哪天都升级到3.0了呢。由于我现在也使用Unity3d开发,文中也有Unity3d的相关指标一起参考...原创 2017-04-25 14:05:34 · 6603 阅读 · 1 评论 -
OpenGL(九)使用 FrameBufferObject
在OpenGL中所有的图形,都会绘制到 FrameBufferObject 上。如果想使用界面的做分屏渲染,或需要屏幕图像制成贴图以备后期处理,就需要用到 FrameBufferObject 技术,这种方式也被称为 RTT (Render to Texture)。原创 2017-04-19 15:27:55 · 7609 阅读 · 0 评论 -
OpenGL(八)使用 subroutine 切换可编程管线
Subroutine 功能是在OpenGL 4.0 版本里才增加的,因此对于各种Android手机,这个功能基本跪了。如果你发现你的程序报错:ARB_shader_subroutine,那就说明当前显卡不支持。不过大体思路可以了解一下,因为思路类似的功能有其他的实现方式。原创 2017-04-14 13:57:42 · 3152 阅读 · 0 评论 -
OpenGL(七) GeometryInstancing 几何体实例化
几何体实例化( GeometryInstancing ),是一种用于大批量重复物件渲染的GPU技术,以降低客户端和显卡端数据传输量,所谓的“一次提交,多次渲染”。简单说来就是合并DrawCall。通过接口可以绘制多次几何体,这样就可以实现合并。原创 2017-04-10 15:34:33 · 2277 阅读 · 0 评论 -
OpenGL(六)使用 VAO 打包指令 优化代码结构
通常说来当创建好vbo的数据结构,还需要设置 glVertexAttribPointer 等一系列属性,在OpenGL中提供了 VAO (Vertex Array Object)它相当于同时记录了数据在哪里和数据是怎样分布。从实际应用的角度,它最重要的贡献就是简化了代码。原创 2017-03-29 12:16:48 · 1931 阅读 · 0 评论 -
OpenGL(五) 指令错误 检测的封装方法
OpenGL的指令,返回值均为void,因此没法通过返回值来判断 指令错误 。为了能够第一时间发现问题,需要加入一个封装来监测是否有指令调用失败。当OpenGL调用出现错误时,会将错误的ID储存到一个`GLenum`中。这个值可以通过glGetError()获取到。原创 2017-03-27 13:43:38 · 3275 阅读 · 0 评论 -
OpenGL(四)Shader错误 检测
由于shader不需要预编译,因此在OpenGL动态加载时会碰到 shader错误 。因此需要区分错误属于C++代码还是shader代码。本文主要探讨如何封装检测 shader错误 的接口。在OpenGL中有方法能够获取到 shader错误 信息。原创 2017-03-20 12:53:29 · 7100 阅读 · 1 评论 -
OpenGL(三) 加载贴图
有了模型还需要贴图。 加载贴图 的流程大体分为两部分,首先是图片的解码,其次是使用UV坐标与模型对应。本文主要从底层原理和第三方库两个方面来介绍 加载贴图 。下面分别介绍硬编码实现和SOIL库两种方式。因为加载不同的类型图片偏移值不一样,加载图片之前要确定图片类型...原创 2017-03-15 12:12:08 · 4722 阅读 · 1 评论 -
OpenGL(二)加载模型
在OpenGL(一) OpenGL管线 与 可编程管线流程中,提到加载VBO、IBO的相关技术,本篇详细说一下。实际应用时,我们是不可能手写顶点和索引点。通常模型是使用3dMax或Maya制作,然后在OpenGL程序中 加载模型 。本文着重分析这些文件的格式以及 加载模型 的流程和方法。原创 2017-03-13 12:59:15 · 4090 阅读 · 2 评论 -
OpenGL(一) OpenGL管线 与 可编程管线流程
由于OpenGL是一个纯渲染核心,要写OpenGL程序,得先搭建一个外壳程序。不同平台下外壳程序的实现各有不同,这个系列的文章都在win32的平台上进行。具体实现,网上能找到很多,所以这不是本文的重点。本篇主要构建探讨 OpenGL管线 本身,具体说来,就是构建可编程管线。原创 2017-03-10 12:21:18 · 4879 阅读 · 0 评论