前言 最近自己想用C语言写一个Minecraft clone(GitHub链接:http://github.com/CharlesDong/m3c/),因为是现代OpenGL,又是C语言,GLM用不了,就要自己写OpenGL矩阵变换,发现自己对具体的变换也不了解,于是决定写一篇博客来总结. 矩阵的定义 先从2D场景说起.先从一个最简单的问题开始. Q1:一个点P(x,y)它关于原点O的对称点为P'(x',y'),请问x',y'与x,y有什么关系? A1: 下面两个问题稍微难一些. Q2:点绕O逆…
Overview 几何数据--顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组合操作改变这些数据. Object Coordinates 对象的本地坐标系--任何变换之前的最初位置.为了变换(transformation)这些对象,可以调用glRotate(),glTranslatef(),glScalef()这些方法. Eye Coordinates 使用GL_MODELV…
OpenGL中使用的矩阵全为列向量为主的矩阵. 参考OpenGL变换网站为  http://www.songho.ca/opengl/gl_transform.html 1.什么是GL_MODELVIEW矩阵? GL_MODELVIEW矩阵是Model矩阵和View矩阵的乘积,即M_modelview = M_view * M_model. model矩阵用于从物体坐标系到世界坐标系的转换,一般是通过旋转.平移或缩放得到. view矩阵用于从世界坐标系到摄像机坐标系的转换. 顶点的矩阵变换如下所…
昨天我遇到一个问题,问题如下: 我使用了延迟渲染,我的渲染流程是:Pass1 --> CUDA并行计算 -->Pass2 CUDA并行计算中需要使用Pass1渲染生成的两张纹理,然而我在GPU端使用CUDA计算时发现纹理为空(数据全是0值),但是如果将两张纹理的数据传回CPU端,打印出来是有值的,且是正确的值.如果在CUDA并行计算之前先将纹理数据传回CPU,这时发现CUDA并行计算中纹理是正常有值的...这个现象很奇怪,我开始想了想会不会是阻塞啥原因,但我对OpenGL阻塞过程不了解,没看到…
今天准备写一篇文章简单介绍一下OpenGL4.5引入的一个新的扩展ARB_direct_state_access,这个扩展为OpenGL引入了一个新的特性就是Direct State Acess,下文统称为DSA.   那么什么是DSA,又为什么要引入DSA呢?   了解OpenGL的都知道,它的设计是一个基于状态机的API,你的每一次资源绑定,纹理绑定,修改渲染状态等等都会改变一个全局的状态机.这种设计的最大问题就是容易造成状态泄露,你可能只是想为纹理设置一个参数,但是却要改变状态机的纹理绑定…
概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION.GL_TEXTURE与GL_COLOR),并且为这些矩阵提供变换函数:glLoadIdentity().glTranslatef().glRotatef().glScalef().glMultiMatrixf().glFrustum()与glOrtho(). 这些内置矩阵与函数对于开发简单的OpenGL程序…
OpenGL中图形绘制后,往往需要一系列的变换来达到用户的目的,而这种变换实现的原理是又通过矩阵进行操作的.opengl中的变换一般包括视图变换.模型变换.投影变换等,在每次变换后,opengl将会呈现一种新的状态(这也就是我们为什么会成其为状态机). 有时候在经过一些变换后我们想回到原来的状态,就像我们谈恋爱一样,换来换去还是感觉初恋好,怎么办?强大的opengl就帮我们提供了两个函数:giPushMatrix()和glPopMatrix(); 首先我们要知道,对于矩阵的操作都是对于矩阵栈的栈…
http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION.GL_TEXTURE与GL_COLOR),并且为这些矩阵提供变换函数:glLoadIdentity().glTranslatef().glRotatef().glScalef().glMul…
每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 在阅读本篇博客之前,你必须对向量和矩阵有基本的认识,并且能熟练进行向量和矩阵的运算 我们已经知道了如何创建一个物体.着色.加入纹理,但它们都还是静态的物体 我们可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动 但是这样的操作太过复杂,而且消耗性能也很大 我们现在有一个更好的解决方案,使用多个矩阵(Matrix)对象变换(Transform)一个物体 如果你具备了我说到的向量和矩阵的数学基础,接下来的操作都很…
我们如今准备好在代码中加入透视投影了. Android的Matrix类为它准备了两个方法------frustumM()和perspectiveM(). 不幸的是.frustumM()的个缺陷,它会影响某些类型的投影,而perspectiveM()仅仅是从Android的ICS版本号開始才被引入,在早期的Android版本号里并没有这种方法.我们能够简单地支持ICS及其以上的版本号.可是这样会丢掉非常大一部分市场.一些用户依旧执行早期的Android版本号. 作为替代,我们能够创建我们自己的方法…
先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为: 1.  每一行每一列都严格单调递增(有其他的版本是递减,其原理相同). 2.  如果将a[k]中的数填完后,矩阵中仍有空间,则填入 ∞. 举例: 这里主要给出杨氏矩阵的定义和查找 方法:理由每一列,没一行都是递增的,我们从左上角开始查找,不断的缩小矩阵的大小,最后只剩一1*1的矩阵. C++代码: #pragma o…
在前面Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架 我们创建了示例程序的基本框架,并提供了一个“Hello World”示例,将屏幕显示为红色. 本例介绍OpenGL ES 3D图形库支持的几种基本几何图形,通常二维图形库可以绘制点,线,多边形,圆弧,路径等等.OpenGL ES 支持绘制的基本几何图形分为三类:点,线段,三角形.也就是说OpenGL ES 只能绘制这三种基本几何图形.任何复杂的2D或是3D图形都是通过这三种几何图形构造而成的. 比如下图复…
主要内容: 傅里叶矩阵及其MATLAB实现 小波变换矩阵及其MATLAB实现  傅里叶矩阵及其MATLAB实现 傅里叶矩阵的定义:(来源: http://mathworld.wolfram.com/FourierMatrix.html) 傅里叶矩阵的MATLAB实现: dftmtx(N) is the N-by-N complex matrix of values around the unit-circle whose inner product with a column vector of…
OpenGL中的矩阵相乘 1, 在OpenGL中所有的视图变换,模型变换 都是4×4矩阵,每个后续的glMultiMatrix*(N),或者变换函数,glTranslate* (),glRotate*(),等都是把一个新的4×4矩阵与当前的矩阵M相乘,不同的是:变换函数glTranslate*(),glRotate* ()等会根据函数参数构造一个4×4矩阵,也设为N 两种情况产生相同的结果:M×N.注意这里的顺序,后续的矩阵是右乘当前矩阵. 2,因为在opengl中坐标表示形式是:[x,y,z]…
定义形状 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/shapes.html 在一个OpenGL ES View的上下文(Context)中定义形状,是创建你的杰作所需要的第一步.在了解关于OpenGL ES如何定义图形对象的基本知识之前,通过OpenGL ES 绘图可能会有些困难. 这节课将讲解OpenGL ES相对于Android设备屏幕的坐标系,定义形状和形状表面的基本知识,如定义一个三角形和一个矩…
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Shadow Volumes方法).在讲解Shadow Mapping基本原理及其基本算法的OpenGL实现之后,将继续深入分析解决几个实际问题,包括如何处理全方向点光源.多个光源.平行光.最近还有可能写一篇Shadow Volumes的博文(目前已经将基本理论弄清楚了),在那里,将对Shadow Ma…
概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操作进行变换. 模型坐标 它是模型对象的局部坐标系,同时也是任何变换之前模型对象的初始位置与朝向.为了变换模型对象,可以使用glRotatef().glTranslatef().glScalef(). 观察坐标 它由模型坐标乘以GL_MODELVIEW矩阵产生.在OpenGL中,可以使用GL_MODE…
[OpenGL ES 03]3D变换:模型,视图,投影与Viewport 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 系列文章: [OpenGL ES 01]OpenGL ES之初体验 [OpenGL ES 02]OpenGL ES渲染管线与着色器 前言 本来打算直接写教程 04 的,但是想到3D 变换涉及的数学知识较多,往往是很多初学者的拦路虎(比如我自己).再加上OpenGL ES 2.0 不再提供OpenGL E…
原文:http://blog.chinaunix.net/uid-20638550-id-1909184.html  分类: 十一.位图与图像 11.1.位图 11.1.1 位图(Bitmap)与字符(Font) 位图是以元素值为0或1的矩阵形式存储的,通常用于对窗口中相应区域的绘图屏蔽.比如说,当前颜色设置为红色,则在矩阵元素值为1的地方象素用红色来取代,反之,在为0的地方,对应的象素不受影响.位图普遍用于字符显示,请看下面例子: 例11-1 位图字符例程(font.c) #include "…
http://www.cnblogs.com/hefee/p/3811099.html OpenGL变换 概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操作进行变换. 模型坐标 它是模型对象的局部坐标系,同时也是任何变换之前模型对象的初始位置与朝向.为了变换模型对象,可以使用glRotatef().glTranslatef().glScalef(…
0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilbert Strang教授的线性代数课程,讲的非常好,循循善诱,深入浅出. Relevant Link:  Gilbert Strang教授的MIT公开课:数据分析.信号处理和机器学习中的矩阵方法 https://mp.weixin.qq.com/s/gi0RppHB4UFo4Vh2Neonfw 1.…
之前写过一篇博客,OpenGL管线(用经典管线代说着色器内部),说的主要是OpenGL的经典管线.大家都知道,现代OpenGL已经弃用(从OpenGL 3.0开始)经典管线功能(glBegin,变换矩阵,光照,雾,纹理坐标自动生成,等),这些功能可以在需要时由着色器实现.现代OpenGL分为core profile和compatibility profile两个版本(文献[1]Appendix D p682),core profile不包含任何弃用功能,而compatibility profil…
OpenGL常用函数   glAccum 操作累加缓冲区   glAddSwapHintRectWIN 定义一组被 SwapBuffers拷贝的三角形   glAlphaFunc允许设置alpha检测功能   glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中   glArrayElement 定义一个被用于顶点渲染的数组成分   glBegin,glEnd 定义一个或一组原始的顶点   glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理  gl…
glAccum 操作累加缓冲区   glAddSwapHintRectWIN 定义一组被 SwapBuffers拷贝的三角形   glAlphaFunc允许设置alpha检测功能   glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中   glArrayElement 定义一个被用于顶点渲染的数组成分   glBegin,glEnd 定义一个或一组原始的顶点   glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理  glBitmap 绘制一个位图…
(一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.aux.glut.wgl.glx.agl 等等. 1.核心函数库主要可以分为以下几类函数 (1) 绘制基本的几何图元函数.如:glBegain(). (2) 矩阵操作.几何变换和投影变换的函数.如:矩阵入栈glPushMatrix(),还有矩阵的出栈.转载.相乘,此外还有几何变换函数glTranslate*(),投影变换函数glOrtho()和…
Android 自从2.2 版本之后之后开始支持OpenGL,在没有支持OpenGL 的 GPU的情况下,也可以使用(通过软件来模拟).在Android上使用Opengl操作的对象是GLSurfaceView,这是一个继承自View的扩展. 在Android上Opengl是通过Vertex Shader 和 Fragment Shader 这两种定点着色器程序来实现图片的加载和渲染的,中文称为定点着色器和片段着色器.一个完整的Opengl程序需要创建定点着色器和片段着色器并将他们Link起来组成…
前面两节内容已经说完了所有的三种变换.也就是说我们现在程序里面既不需要glLookAt(),也不需要gluPerspective(),这些矩阵我们都可以自己写.然后,再用glMultMatrix()来调用这些矩阵,注意一点就是OpenGL是左乘,前面给出的矩阵都是右乘矩阵,所以调用的时候需要转置,摆放的位置也要注意.当然,如果用shader的话,这些函数也就用不到了,矩阵顺序也可以自己定义.这里所有的变换都是作用在顶点(Vertex)上的,但是还有一类数据需要进行变换,那就是顶点法线.我们在计算…
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十七课:卡通映射 卡通映射: 什么是卡通了,一个轮廓加上少量的几种颜色.使用一维纹理映射,你也可以实现这种效果.   看到人们仍然e-mail我请求在文章中使用我方才在GameDev.net上写的源代码,还看到文章的第二版(在那…
我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的.有着诸多对手竞争的领域上极为常见.比如吧,搞DirectX的人用了左手坐标系,搞OpenGL的人偏偏就要用右手坐标系.这种情况的目的,是让他们那些搞科学的人得以突出他们的存在感和优越感.这种增加了这么多记忆成本只为了让他们爽一爽的事儿,对于我这种被科学搞了的人来说 ,就只剩下纠结和郁闷这两种感觉了.以上是某天看书看烦了的感想. Anyway,在学习RenderMonkey…