OpenGL ES

基于OpenGL ES实现多媒体全景渲染

近几年来,VR型的多媒体变得越来越常见。在YouTube上就有很多360度视频,很多地图产品也提供全景街道图。作为开发者,我们不禁要想如何实现多媒体的全景渲染呢?

其实,渲染VR的多媒体其实并不难,这里就以360度视频为例介绍一下。我也没有尝试过从头写一个360视频渲染库(目前能力和精力都不太允许),所以这篇博客其实是基于开源库的——
https://github.com/ashqal/MD360Player4Android 。此外,我不准备详细去介绍这个库怎么使用,而是基于它分析整个渲染流程。

全景视频一般由鱼眼镜头产生,鱼眼镜头的物理结构大致如下:

基于OpenGL ES实现多媒体全景渲染

最左边的就是一个曲面的镜头,光线就是从这里进入相机的。然后,光线经过一系列的光学结构,最终会映射到最右边的成像面上,也就是CMOS传感器阵列上。从图中可以看出,边缘的光线会被压缩,这是广视角导致的。下面这张图可以非常直观的体现这种图像映射关系。

学习OpenGL ES之法线贴图

本文将给大家介绍法线贴图的相关知识,在游戏中由于GPU资源有限,尤其是在移动设备中,所以无法使用大量的三角形来表示3D模型的细节。这时候法线贴图就成为了折中的渲染方案,既能够带来不错的细节表现效果,还可以减少资源的消耗。

未使用法线贴图的Cube

学习OpenGL ES之法线贴图

使用了法线贴图的Cube
学习OpenGL ES之法线贴图

通过上面的图可以看出,法线贴图给Cube表面增加了很多光照上的细节。

什么是法线贴图

学习OpenGL ES之高级光照

基本光照中为大家介绍了环境光和漫反射光构成的基本光照模型。本文将为大家介绍Blinn-Phong光照模型,通过环境光,漫反射光和高光渲染出更加真实的物体。

学习OpenGL ES之高级光照

Blinn-Phong光照模型分为三个部分,环境光,漫反射光,高光(也可以理解为镜面反射光),将这三种光和物体本来的颜色融合,就可以计算出最终的颜色了。下面我们先来介绍这三种光的物理含义。

环境光

学习OpenGL ES之激光特效

本文主要介绍如何使用2个四边形实现一个简单的激光效果。下面是最终效果图。

学习OpenGL ES之激光特效

在了解激光实现原理之前,先介绍一下我对上一篇文章的代码进行的简单重构。我把OpenGL关键性的代码都集成到了
GLContext 类中。

#import <GLKit/GLKit.h>

@interface GLContext : NSObject
@property (assign, nonatomic) GLuint program;
+ (id)contextWithVertexShaderPath:(NSString *)vertexShaderPath fragmentShaderPath:(NSString *)fragmentShaderPath;
- (id)initWithVertexShader:(NSString *)vertexShader fragmentShader:(NSString *)fragmentShader;

学习OpenGL ES之基本光照

本文主要介绍如何使用Shader实现平行光的效果。什么是平行光呢?我们可以拿激光做比喻,平行光的方向不会随着离光源的距离而改变。所以我们在模拟平行光的时候仅仅需要使用一个光照方向即可。

我们有了光照方向,接下来还需要一个重要数据,平面的朝向。一个平面如果刚好面朝光线,那自然是最亮的。当然还有些材质的平面可以反射光线,反射光线的强度和你观察的角度相关,不过这些本文都不会介绍。后面会有专门一篇介绍复杂的光照模型。

我们用法线向量来表示平面朝向,在具体实现中,每个点都会有一个法线向量。所谓法线向量就是垂直于平面的一个三维向量,如下图所示。

垂直于平面的一个三维向量

图中展示了两种法线向量的表示方法,左边是每个多边形的每个点有一个法线向量,右边是每个点有一个法线向量,共享点的法线向量是这个点在所有平面上的法线向量之和。法线向量应该总是被规范化成单位向量。本文的例子中使用的是左边的方式。

有了法线向量和光照方向之后,只要将它们相乘即可得到光照强度。接下来开始分析代码。

我的OpenGL ES学习之路(一):GLSL着色器语言

着色器语言

GLSL即 OpenGL Shading Language,着色器语言,是和GPU打交道的语言,GLSL的语法比较像C语言。

版本

OpenGL ES的顶点着色器和片段着色器的第一行声明GLSL的版本:

#version 300 es // 使用3.0版本
如果没有声明版本号,则会认为使用1.0版本,着色器的1.0版本用于OpenGL ES 2.0,从OpenGL ES 3.0 开始,规范匹配API和着色器语言的版本号,所以版本才从1.0跳到3.0。

数据类型

基本数据类型

GLSL有三种基本数据类型:float,int,bool,还有由这三种数据类型组成的数组和结构体。

float myFloat = 1.0;
float floatArray[4];
float a[4] = float[](1.0, 2.0, 3.0, 4.0);
float b[4] = float[4](1.0. 2.0, 3.0, 4.0);

Vulkan vs OpenGL ES:PowerVR 3D卫星导航APP

PowerVR架构能快速支持最新的技术,Vulkan API便是实证。Vulkan是一款现代的API,使开发人员能够获得底层图像硬件的“低级”访问权限,确保硬件性能的最大化。

任何需要显示大量数据的应用程序(如导航软件)便是Vulkan的绝佳使用案例。导航应用程序需要大量的后台处理,使大量的相关信息尽可能以较高的帧速率进行渲染。在这里,我将详细介绍最新的卫星导航演示系统,我将阐述其如何利用Vulkan图像API、对比Vulkan与OpenGL ES的性能、阐释为何PowerVR适合运行这类使用了现代图像API(如Vulkan)的程序。

Vulkan and OpenGL ES

首先,让我们先回顾Vulkan和OpenGL ES之间的差异。与OpenGL ES相比,Vulkan基本上设计有完全和明确的控制,其中包括对多线程分布工作负载的严格控制。

OpenGL ES学习阶段性总结

前言
最近观看下面这本书有感,结合之前的学习,对OpenGL的知识进行回顾。

概念
帧缓存:接收渲染结果的缓冲区,为GPU指定存储渲染结果的区域。
帧缓存可以同时存在多个,但是屏幕显示像素受到保存在前帧缓存(front frame buffer)的特定帧缓存中的像素颜色元素的控制。
程序的渲染结果通常保存在后帧缓存(back frame buffer)在内的其他帧缓存,当渲染后的后帧缓存完成后,前后帧缓存会互换。(这部分操作由操作系统来完成)
前帧缓存决定了屏幕上显示的像素颜色,会在适当的时候与后帧缓存切换。
- (BOOL)presentRenderbuffer:(NSUInteger)target;
Core Animation的合成器会联合OpenGL ES层和UIView层、StatusBar层等,在后帧缓存混合产生最终的颜色,并切换前后帧缓存;

OpenGL ES实践教程之VR全景视频播放

这一篇介绍以下知识点:

AVFoundation——加载视频;
CoreVideo——配置纹理;
OpenGL ES——渲染视频;
3D数学——球体以及3维变换;

核心思路
通过AVFoundation加载视频源,读取到每一帧的CMSampleBuffer之后,用CoreVideo创建OpenGL ES纹理缓存并上传GPU;OpenGL ES按照球体的模型来渲染视频;用移动摄像机朝向或者旋转球体的方式来响应手指的移动达到移动镜头的效果。

效果展示

具体细节
1、配置OpenGL ES;
● loadShaders加载着色器和compileShader编译着色器的内容前面的教程已经介绍过都次,不再赘述;
● setupBuffers配置缓存信息,并且创建顶点数据缓存,把球体的顶点和纹理数据先上传GPU;

OpenGL ES 和 Vulkan 又一次对比测试

随着几个月前谷歌新一代Android操作系统:Android N(7.0)的发布,谷歌将支持新版Vulkan图形显示API。如果你还没有听说过Vulkan,那么我们可以为您提供一个Vulkan的完整纲要——涵盖所有你需要了解的项目,另外,我们就利用Vulkan制作高性能的3D应用程序做了深入研究。问题的关键在于,相比OpenGL ES3.1和OpenGL ES 2.0版本,Vulkan性能如何?让我们一起来了解一下。

测试方法论

目前,尚且没有简单的方法在Android系统里对Vulkan和OpenGLES 3.1作对比测试。我的Unreal3D引擎并不支持android-24API,所以即便Vulkan在技术层面上是支持的,但是我的Nexus6P智能手机并不兼容Vulkan。

图形比较

图形比较

同步内容
--电子创新网--
粤ICP备12070055号