OpenGL
OpenGL 的相关知识
ShaderJoy
醉心于研究一些特效(用代码来画画),曾涉猎过图形图像视频处理 、计算机视觉 、增强现实/虚拟现实等技术领域,就职于美图。
展开
-
ShaderJoy —— 仅占用一个纹理单元显示 YUV(I420) 纹理 【GLSL】
效果图第一种 yuv2rgb 的转换矩阵第二种 yuv2rgb 的转换矩阵使用单张纹理的优点:YUV 三个分量存在一块连续内存上(常见的 OpenCV / libyuv 转换的结果都是在一块连续的内存上),相对于把 YUV 三个分量分别存在三块内存中,可以加快主存到显存的传输,避免不必要的glTextureImage2D 调用,减少 CPU 中断;而且将它们作为一整块纹理,可以节省 GL 所绑定纹理单元。原图RGB 原图RGB 原图和效果图进行...原创 2020-10-14 19:17:13 · 1505 阅读 · 4 评论 -
最简单的 MRTs(Multi Render Targets)的完整代码示例【OpenGL】
MRTs 允许应用程序同时渲染多个颜色缓冲区话不多言,详细代码和注释如下:// HelloBlitFramebuffer.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include // -----------------------------------typedef struct{ // Han原创 2017-01-09 12:36:59 · 2681 阅读 · 1 评论 -
GLSL语言基础
转自: 小楼一夜听春雨、http://www.kankanews.com/ICkengine/archives/120870.shtml 变量GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。 基本类型除了布尔型转载 2017-01-13 20:34:45 · 1676 阅读 · 0 评论 -
简单的笔刷效果【OpenGL】
(字写得还不如小学生=_=b)原创 2017-01-02 15:28:07 · 3819 阅读 · 2 评论 -
Android Coverflow Gallery 的关键源码解析【Android】【OpenGL】
注意:该代码是基于OpenGL ES 1.XCoverFlowOpenGL.java/* * Copyright 2013 - Android Coverflow Gallery. (Vladyslav Yarovyi) * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use原创 2017-01-02 15:54:32 · 1719 阅读 · 0 评论 -
最简单的PBO(异步Read-Back)Demo 完整代码示例
本Demo 主要是参考了http://www.songho.ca/opengl/gl_pbo.html 的 pboPack.zip,但是我是基于FreeGlut 、Glew 库和 Soil 库(Soil库是负责从本地加载纹理),并删减了一些和主题不相关的代码。原理示意图:完整代码及详细解释如下:#include #include #include #include#define WI原创 2016-11-22 15:16:26 · 2785 阅读 · 0 评论 -
《OpenGL 超级宝典(Super Bible)第七版》 有关 PBO 的 Example
该代码除了使用了 PBO 还是加入了 OpenMP 代码及关键注释如下: /* * Copyright ?2012-2015 Graham Sellers * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and...原创 2016-11-21 11:18:26 · 1840 阅读 · 0 评论 -
《OpenGL 超级宝典(Super Bible)第五版》 有关 PBO 的 Example
代码即关键注释如下:static GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };static GLfloat vWhite[] = { 1.0f, 1.0f, 1.0f, 1.0f };static GLfloat vLightPos[] = { 0.0f, 3.0f, 0.0f, 1.0f };GLsizei screenWidth;原创 2016-11-21 00:10:00 · 2255 阅读 · 0 评论 -
《OpenGL ES 2.0 Programming Guide》第12章“最简单的ReadPixels并保存为BMP”示例代码【C语言版】
由于《OpenGL ES 2.0 Programming Guide》原书并没有提供第12章的示例代码,书上的代码也只提到关键的步骤,而网上大多是Android/iOS版本的示例,C/C++的大都基于OpenGL或OpenGL ES 3.0,为了加深理解,遂自己实现了一份C语言版本的,希望能够帮助到同样喜欢OpenGL ES 2.0的同学。废话不多说,直接上代码#include "原创 2016-09-04 02:17:49 · 2934 阅读 · 0 评论 -
从本地加载纹理【基于SOIL库】
本文参考自:http://blog.csdn.net/dreamcs/article/details/7696069不过他是利用GLUT和GLAUX库加载的位图,我是基于SOIL(Simple OpenGL Image Library)库。关于SOIL库的资料可以移步 http://lonesock.net/soil.html(网站只提供基于VC工程的源码,需要自己简单编译一下)原创 2016-11-02 16:26:20 · 3515 阅读 · 0 评论 -
基于FFmpeg 和 OpenGL 的视频播放 【C++】
环境:GLFW版本为 2.7.9GLM版本为0.9.4.6(需自己编译生成 dll 和 lib)OpenGL 3.+以下代码仅仅通过ffmpeg解码视频(没有处理音频流),然后通过OpenGL进行显示(或通过Shader对视频帧进行处理)代码如下:std::string const vert_shader_source = "#version...原创 2016-10-23 20:15:39 · 9598 阅读 · 4 评论 -
OpenGL深入探索——广告牌(Billboard)和几何着色器
背景在前面的几章内容里,我们已经认识了顶点着色器和片元着色器,但事实上,我们遗漏了一个很重要的着色器——几何着色器(GS)。微软在 DirectX10 中使用了这个着色器,后来被集成到了 OpenGL3.2 的内核中。VS 会对每一个顶点执行一次, FS 会对每一个片元执行一次,GS 则会对每一个基本图元执行一次。也就是说,如果我们绘制一些三角形,那么 GS 的每一次调用都会接收到一个三角形;转载 2016-06-22 22:28:32 · 5107 阅读 · 0 评论 -
《OpenGL ES 2.0 Programming Guide》第12章 “最简单的Multi-Pass+VBO”示例代码【C语言版】
由于《OpenGL ES 2.0 Programming Guide》原书第12章并没有提供相关的示例,为了加深理解,遂自己实现了一份C语言版本作为练习,希望能够帮助到同样喜欢OpenGL ES 2.0的同学。在实现的时候遇到的问题:由于ES 2.0的 Frame Buffer 只支持一个Color Attachement,所以不能使用OpenGL 的 Multi-Target 的方式原创 2016-09-05 21:34:18 · 2616 阅读 · 0 评论 -
简单的 AR 效果实现【OpenGL】【OpenCV】
说明:通过笔记本摄像头实时采集现场画面,当程序检测到模板图像(手机相册中的照片)时,显示一个带纹理的立方体。其实类似的代码是三年前写的,只不过当时用的GL 1.X,现在只是修改 GL 的代码,改为支持 Shader而已。OpenCV的检测算法还有待优化,抖动比较明显,但是毕竟是三年前写的,要花点时间看看。还有一些新的 bug 有待 fix。效果如图:1.没有特效的纹理立方体:2. 带简单马赛克特效原创 2017-01-15 00:11:04 · 8702 阅读 · 4 评论 -
ShaderJoy ——基于FFmpeg 和 OpenGL 的音视频合成+过渡转场+文字抖动特效展示【C++】【GLSL】
视频效果:生成视频效果带文字的效果(优酷质量压缩较模糊)效果图:简介:[平台: Windows, Linux, Android, iOS]基于若干张用户照片(等比例缩放至统一大小,不足则填充黑边),结合音频文件,经过音视频同步(音频时长较短则循环播放,音频时长较长则以视频时长为准)后,生成一个带转场特效的视频文件。支持多种音频格式,如 aac/mp3...原创 2020-03-15 19:59:33 · 11403 阅读 · 31 评论 -
ShaderJoy —— 基于几何着色器的 Mesh “爆炸” 效果【GLSL】
先贴个效果图先挖个坑,以后再详细填原创 2017-06-18 19:30:53 · 4537 阅读 · 13 评论 -
不同字体的绘制【OpenGL】【FreeType】
原创 2017-06-12 09:18:44 · 2824 阅读 · 1 评论 -
基于人脸关键点的姿态定位【OpenCV】【OpenGL】
右侧实心点为人脸实际关键点,空心点为重投影后的关键点;左侧为根据姿态投影的3维人头模型原创 2017-06-08 22:35:55 · 4339 阅读 · 6 评论 -
Windows 上 Assimp(Open Asset Import Library) 源码的编译 及 Samples 的编译运行
Assimp 为加载多种已知 3D 模型格式提供了一套统一的方式,而且它还是开源跨平台的(Android/iOS 也都有支持)。可能会遇到的错误及解决方法:1.errorLNK2019:无法解析的外部符号_compress,该符号在函数_wmain中被引用这个错误是因为Cmake没有选择正确的 ZLIB 库,可以选择自己本地已有的ZLIB库,也可以通过勾选 C...原创 2016-10-26 01:03:50 · 7310 阅读 · 1 评论 -
最简单的 UBO(Uniform Buffer Object) 【修订补充】【OpenGL】【GLSL】
一、引入 Uniform Buffer Object / Uniform Block 的 原因1) 如果程序涉及了多个 Shader 程序,而且它们使用同一个Uniform变量,那么你就需要为每个 Shader 程序单独管理它们。当一个程序被链接时,OpenGL 会自动生成 Uniform 的位置,因此对于不同的 Shader 程序,同一个 Uniform 变量的位置可能是不一样的。而 Unif原创 2017-05-07 14:47:28 · 5347 阅读 · 0 评论 -
像素缓冲区对象(PBO) 的Streaming-Texture上传 源码解析
接这篇文章 OpenGL深入探索——像素缓冲区对象 (PBO)(附完整工程代码地址)首选检查显卡是否支持 PBO :#if defined(_WIN32) // check PBO is supported by your video card // 检查显卡是否支持 PBO if (glInfo.isExtensionSupported("GL_ARB_pixel_buffer原创 2016-11-22 11:18:02 · 3465 阅读 · 0 评论 -
像素缓冲区对象(PBO)的异步Read-Back 源码解析
接这篇文章 OpenGL深入探索——像素缓冲区对象 (PBO)(附完整工程代码地址)关键代码如下:int main(int argc, char **argv){ initSharedMem(); // register exit callback atexit(exitCB); // init GLUT and GL initGLUT(argc, a原创 2016-11-21 23:51:36 · 2622 阅读 · 3 评论 -
最简单的几何着色器(Geometry Shader)【法线和线框的绘制】【OpenGL】【GLSL】
以绘制模型的法线的为例,效果如图:Torus:Dragon:关键代码如下:1.顶点着色器 static const char * vs_source[] = { "#version 410 core \n" "原创 2017-05-06 09:53:38 · 3123 阅读 · 0 评论 -
使用计算着色器(Compute Shader)模拟粒子效果【OpenGL】【GLSL】
效果如图:关键代码及注释如下:C++ 代码void initialize(){ // 计算着色器 GLuint compute_shader = buildShader( &compute_shader_source, GL_COMPUTE_SHADER, "Error in compiling the compute shader\n"); compute_prog =原创 2017-04-23 17:29:02 · 9772 阅读 · 0 评论 -
最简单的粒子特效(Transform Feedback ) 的关键代码示例【OpenGL】
使用 Transform Feedback 的优点:1.允许顶点着色器的输出存储在一个 buffer 对象上,之后其他 shader 程序可以读取 buffer 对象的数据进行绘制(本shader也可以读取它作为下一次顶点着色器的输入);2.允许在GPU(顶点着色器)上实现粒子发射器,不用依赖CPU,即不用在CPU上利用随机数初始化粒子,而把该操作迁移至顶点着色器中。最终效...原创 2017-01-10 21:29:45 · 6776 阅读 · 6 评论 -
最简单的曲面细分着色器(Tesselation Shader)【OpenGL】【GLSL】
效果如图:按 ‘m’ 键后代码及详细注释如下GLuint program;GLuint vao;void startup(){ static const char * vs_source[] = { "#version 410 core \n" "原创 2017-04-30 10:30:48 · 6838 阅读 · 2 评论 -
Adreno Profiler 分析任意安卓游戏特效、抓取资源
转载自:http://www.kuqin.com/shuoit/20150517/346102.html最近发现了一个非常好用的工具Adreno Profiler,可以用来分析安卓手机上OpenGL ES绘制过程。这个东西牛的地方在于可以抓取任何可以运行的App,而且使用起来非常方便、没有额外限制。这个工具本质上是一个OpenGL ES Draw Call Replay;如果你用过PIX或者GP转载 2017-02-22 13:47:45 · 7755 阅读 · 3 评论 -
《OpenGL ES 2.0 Programming Guide》第12章 “最简单的本地纹理+FBO+VBO”示例代码【C语言版】
由于《OpenGL ES 2.0 Programming Guide》原书第12章并没有提供相关的示例,为了加深理解,遂自己实现了一份C语言版本作为练习,希望能够帮助到同样喜欢OpenGL ES 2.0的同学。废话不多说,直接上代码:#include #include #include "esUtil.h"#include "userData.h"#define原创 2016-09-04 18:51:13 · 2193 阅读 · 1 评论 -
《OpenGL ES 2.0 Programming Guide》第12章“最简单的FBO Depth Texture”示例代码【C语言版】
由于《OpenGL ES 2.0 Programming Guide》原书并没有提供第12章的示例代码,书上的代码也只提到关键的步骤,而网上大多是Android/iOS版本的示例,C/C++的大都基于OpenGL或OpenGL ES 3.0,为了加深理解,遂自己实现了一份C语言版本的,希望能够帮助到同样喜欢OpenGL ES 2.0的同学。废话不多说,直接上代码:// Simple原创 2016-09-03 16:40:44 · 1927 阅读 · 0 评论 -
OpenGL深入探索——使用Assimp加载模型
转载自:第二十二课 使用Assimp加载模型背景到现在为止我们都在使用手动生成的模型。正如你所想的,指明每个顶点的位置和其他属性有点时候并不是十分方便。对于一个箱子、锥体和简单平面还好,但是像人们的脸怎么办?现实的商业应用和游戏中,程序中使用模型一般都是由美术人员通过如 Blender, Maya 或 3ds Max 等建模软件来解决这个问题。这些软件提供了高级的工具帮助他们创造很复杂的模转载 2016-06-22 17:59:39 · 4353 阅读 · 1 评论 -
OpenGL ES Shader相关API 总结【4】—— GLSL 语法小结【持续更新】
基本类型:1.数值类型2.布尔类型注意:不能自动转型;矢量也不能自动补齐变量:1.a-z, A-Z, 0-9, _2.首字母不能为数字3.不能用关键字和保留字作变量名4.不能以gl_,_webgl_开头复杂变量结构体和C类似数组1.只支持一维数组2.长度必须大于0的整型常量表达式3.不可用const修饰取样器1.通原创 2016-05-11 15:52:42 · 3220 阅读 · 0 评论 -
Windows搭建OpenGL ES 2.0开发环境
1.下载并安装AMD的OpenGL ES2.0的模拟器【AMD:老牌模拟器,已经随着AMD的手持设备业务一起卖给Qualcomm。这款模拟器基本上中规中矩,用于 桌面开发OpenGL ES 2的开发没问题。它的扩展能满足常见的特效需要,兼容性和速度也不错。AMD的OpenGL ES模拟器对ES标准的支持程度甚至好于AMD的OpenGL驱动对GL标准的支持。】2.下载《OpenGL原创 2016-06-30 00:49:37 · 5256 阅读 · 0 评论 -
OpenGL ES Shader相关API 总结【2】——执行绘制命令
执行绘制命令======================1.GLint glGetUniformLocation(GLuint program, const GLchar* name);功能:获取指定program中的某个uniform的index,在OpenGL ES中就可以通过index对uniform进行访问;输入:指定program的ID, program绑定的某个原创 2016-05-11 13:48:08 · 1611 阅读 · 0 评论 -
OpenGL ES Shader相关API 总结【5】——VBO与VAO的作用与关系
早期的OpenGL为了将模型的顶点数据传送到显卡,需要逐个顶点进行(冗余处理的问题),如果还需要额外的信息(纹理坐标和法线)的话,当模型比较复杂时,将导致大量函数的调用,传输开销是相当大的!为了解决这个问题引入了VBO(Vertex Buffer Object),VBO可以将顶点数据保存在显存中,绘制时直接从显存中取数据,减少了数据传输的开销。顶点属性(Vertex Attribute),是关原创 2016-05-16 14:13:17 · 3156 阅读 · 0 评论 -
OpenGL深入探索——缓冲区对象(*BO)
转载自:http://blog.csdn.net/afei198409/article/details/8267300缓冲区对象许多OpenGL操作都向OpenGL发送一大块数据,例如向它传递需要处理的顶点数组数据。传输这种数据可能非常简单,例如把数据从系统的内存中复制到图形卡。但是,由于OpenGL是按照客户机-服务器模式设计的,在OpenGL需要数据的任何时候,都必须把数据从客户机转载 2016-05-31 15:51:03 · 2763 阅读 · 0 评论 -
OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器
转载自 《OpenGL编程指南(原书第8版)》——计算着色器概述由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件。过去,这种处理器主要被设计用于承担实时图形渲染中海量的数学运算。然而,其潜在的计算能力也可用于处理与图形无关的任务,特别是当无法很好地与固定功能的图形管线结合的时候。为了使得这种应用成为可能,OpenG引入一种特殊的着色器:计算着色器。计算转载 2016-06-28 21:17:05 · 5191 阅读 · 0 评论 -
OpenGL深入探索——阴影贴图(二)
转载自:第二十四课 阴影贴图(二)背景在前面一节中我们学习了 shadow mapping 的基本原理,并且介绍了如何将深度信息渲染到一张纹理上面并最终通过从深度缓存中进行采样而将其渲染到屏幕上面。在这一节中我们将会介绍如何使用这个功能来创建真正的阴影。我们知道 shadow mapping 是一个二次渲染技术,在第一次渲染过程中场景的渲染是从光源角度出发的。让我们回顾一下在第一次转载 2016-06-24 01:19:12 · 1590 阅读 · 0 评论 -
OpenGL深入探索——曲面细分
转载自:曲面细分背景曲面细分( Tessellation )是 OpenGL4.x 中的一个令人兴奋的新特性,Tessellation 主要用于解决 3D 模型的静态属性,包括他们的精细度和多边形数量。具体来说就是当我们近距离观察一个复杂的模型(如人脸)时,我们希望能够看到这个模型的所有细节(例如皮肤的褶皱),所以我们需要使用一个高精细度的模型。一个高精细度的模型自然是需要更多的三角面以及转载 2016-06-23 13:23:19 · 5322 阅读 · 0 评论 -
OpenGL深入探索——阴影贴图(一)
转载自:第二十三课 阴影贴图(一)背景阴影和光是紧密联系在一起的,因为如果你想要产生一个阴影就必须要光。有许多的技术可以生成阴影,在接下来的两个章节中我们将学习其中的一种比较基础简单的技术-阴影贴图。当光栅化的时候,你会问这个像素是否位于阴影中?让我们换个问法,从光源到像素的路径是否中间经过其他物体?如果是,这个像素可能位于阴影中(假定其他的物体不透明),如果不是,则像素不位于阴影转载 2016-06-23 23:44:09 · 2442 阅读 · 0 评论 -
OpenGL ES Shader相关API 总结【3】——绑定shader
绑定Shader1.GLuint glCreateShader(GLenum shaderType)功能:创建一个指定类型的shader对象输入:shader类型输出:一个该类型的shader对象2.void glShaderSource(GLuint shader, GLsizei, count, const GLchar* const* string, const原创 2016-05-11 14:38:07 · 2000 阅读 · 0 评论