薪火相传


OpenGL(十三) 天空盒 的 shader 实现

天空盒 的使用可以使用户感觉所处一个封闭的世界环境,使得游戏更加真实。本文主要介绍如何通过OpenGL和GLSL来实现天空盒。 核心原理 天空盒 的核心原理其实并不复杂,它相当于在视线外套上一个盒子。盒子有6个面,分别使用6张可以拼接在一起的图片。从原理上讲,通过比较视线的xyz […]


OpenGL(十一) 可编程管线 基础光照 的实现

在OpenGL中创建 基础光照 ,主要的工作将模型中的法线信息和法线空间运算矩阵传入到shader中。另一方面,LightDir,ViewDir通常是在shader中从引擎参数获取的,为了简化光照模型的实现,这里我们可以在shader中写死。至于经典的 ambient+diffu […]


OpenGL(九)使用 FrameBufferObject

在OpenGL中所有的图形,都会绘制到 FrameBufferObject 上。如果想使用界面的做分屏渲染,或需要屏幕图像制成贴图以备后期处理,就需要用到 FrameBufferObject 技术,这种方式也被称为 RTT (Render to Texture)。 原理 通过 [ […]


OpenGL(八)使用 subroutine 切换可编程管线

Subroutine 功能是在OpenGL 4.0 版本里才增加的,因此对于各种Android手机,这个功能基本跪了。如果你发现你的程序报错:ARB_shader_subroutine,那就说明当前显卡不支持。不过大体思路可以了解一下,因为思路类似的功能有其他的实现方式。 原理 […]


OpenGL(七) GeometryInstancing 几何体实例化 2

几何体实例化( GeometryInstancing ),或者说实例渲染(Instanced Rendering),是一种用于大批量重复物件渲染的GPU技术,以降低客户端和显卡端数据传输量,所谓的“一次提交,多次渲染”。简单说来就是合并DrawCall。 原理 通过 [crayo […]


Unity3d 开发 通过 shader编译参数 整合代码

在编写大型项目的shaders时,大多数像素混合算法都是通用的,而且基本上一旦完成就不会更改。另一方面,在shader中不宜做分支逻辑,会引起效率上的消耗。因此很为了更好的组织shader代码,Unity引入了 shader编译参数 来解决这个问题。 原理 由于GPU中的寄存器结 […]


OpenGL(五) 指令错误 检测的封装方法 1

OpenGl的指令,返回值均为void,因此没法通过返回值来判断 指令错误 。为了能够第一时间发现问题,需要加入一个封装来监测是否有指令调用失败。 原理 当OpenGL调用出现错误时,会将错误的ID储存到一个GLenum中。这个值可以通过 [crayon-5997646147de […]


Unity3d 开发 OnMouse_产生GC 的问题修复

最近发现一个特别奇怪的现象,在游戏运行时,每帧 OnMouse_产生GC ,大小是0.6KB的整数倍。具体Profiler效果如下图所示: 解决方法 经过比照发现这个问题与摄像机相关。由于是代码创建的摄像机组件,因此并未挂载GUILayer组件。解决这个问题的方法就是使用AddC […]


OpenGL(四) Shader错误 检测

由于shader不需要预编译,因此在OpenGL动态加载时会碰到 shader错误 。因此需要区分错误属于C++代码还是shader代码。本文主要探讨如何封装检测 shader错误 的接口。 原理  在OpenGL中有方法能够获取到 shader错误 信息。使用: [crayon […]


OpenGL(三) 加载贴图

有了模型还需要贴图。 加载贴图 的流程大体分为两部分,首先是图片的解码,其次是使用UV坐标与模型对应。本文主要从底层原理和第三方库两个方面来介绍 加载贴图 。 解码 下面分别介绍硬编码实现和SOIL库两种方式。 硬编码实现 因为加载不同的类型图片偏移值不一样,加载图片之前要确定图 […]