OpenGL ES一些函数详解(一)

glLoadIdentity和glMultMatrix

 

    glLoadIdentity的作用是将当前模型视图矩阵转换为单位矩阵(行数和列数相同的矩阵,并且矩阵的左上角至右下角的连线上的元素都为1,其它元素都为0),这样可以方便矩阵的乘法运算。

        glMultMatrix矩阵的乘法.

        如:

glLoadIdentity();glMultiMatrix(A);glMultiMatrix(B);glMultiMatrix(C);

 

针对行向量和当前矩阵,上述代码可等价于:

(vx vy vz 1) *C*B*A

结果是一个1行4列的矩阵。

 

你可能会奇怪,为什么程序和实际矩阵的运算顺序是相反的呢。可以这么想像一下,glMultiMatrix先将矩阵加入到一个栈中保存,当所有的glMultiMatrix操作都完成后,再依次从栈中将缓存的矩阵取出并做相应的乘法操作。由于栈结构是先进后出的数据结构,所以可以猜想glMultiMatrix在执行时并没有直接将矩阵进行计算,而是先将矩阵放在了栈缓存中。

OpenGL ES 模型视图之缩放操作 

 

对当前模型视图进行缩放,在OpenGL ES 1.0中可以使用glScale*函数,而在2.0中需要自己设置缩放矩阵。

       如,分别使用sx,sy,sz表示在x,y,z轴上的缩放比例,那么在1.0中可以这样缩放模型视图:

glScalef(sx, sy, sz);

       在2.0中你需要这么做:

float scale[16] = {sx, 0, 0, 0,0,  sy, 0, 0,0,  0, sz, 0,0,  0, 0, 1  };glMultiMatrixf(scale);

       缩放矩阵的推导过程如下:

vS = (vx vy vz 1) = (vx*sx vy*sy vz*sz 1*1) = v '

 

OpenGL ES 模型视图之平移操作

   对当前模型视图进行平移操作,在OpenGL ES 1.0中可以使用glTranslate*函数,而在2.0中需要自己设置平移矩阵。

       如,分别使用tx,ty,tz表示在x,y,z轴上的移动距离,那么在1.0中可以这样平移模型视图:

glTranslatef(tx, ty, tz);

       在2.0中你需要这么做:

float translation[16] = {1, 0, 0, 0,0,  1, 0, 0,0,  0, 1, 0,tx,  ty, tz, 1  };glMultiMatrixf(translation);

       平移矩阵的推导过程如下:

vT = (vx vy vz 1) = (vx+tx  vy+ty  vz+tz 1*1) = v '

  OpenGL ES之glRotate函数                         

glRotate—— 使用一个旋转矩阵乘以当前矩阵

函数原型:

void glRotatef(GLfloat angle,  GLfloat x,  GLfloat y,  GLfloat z); 

void glRotatex(GLfixed angle,  GLfixed x,  GLfixed y,  GLfixed z);

函数参数:

angle  指定旋转角度,单位为度。

x, y, z    指定一个向量的  x, y, z 坐标

描述:

glRotate产生一个围绕vector(x,y,x),角度为angle的旋转操作。旋转矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:

其中,c = cos(angle),s = sin(angle),并且||(x, y, z)|| = 1(如果不是,OpenGL ES会标准化它)。

如果矩阵模式设为GL_MODELVIEW 或 GL_PROJECTION,那么在glRotate后面绘制的所有对象都将被旋转。使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。

注意:

旋转遵循右手规则,如果向量(x,y,z)点正对着用户的话,旋转是逆时针的。

   

OpenGL ES之glPushMatrix, glPopMatrix函数

glPushMatrix, glPopMatrix—— 压入和弹出矩阵栈

void glPushMatrix(void); 

void glPopMatrix(void);

描述:

对于每一种矩阵模式都有一个矩阵栈。对于GL_MODELVIEW,栈的深度最少为16。对于GL_PROJECTION和GL_TEXTURE,栈的深度最少为2。任何模式的当前矩阵都是指该模式的矩阵栈顶的那个矩阵。

glPushMatrix 复制当前矩阵并将其加入栈中,此时它处于栈顶位置。

glPopMatrix   弹出当前矩阵栈,当前矩阵被弹出,之前处在其下的那个矩阵将变为栈顶。

默认的,每个栈都包含一个矩阵,唯一标识的矩阵。

向已经填满的栈压入矩阵或从仅有一个矩阵的栈中弹出矩阵都会引起错误。

注意

每一个纹理单元都有自己的纹理矩阵栈,使用glActiveTexture选择想要的那个纹理矩阵栈

     OpenGL ES之glFrustum函数

 

glFrustum—— 使用一个透视矩阵乘以当前矩阵

函数原型:

void glFrustumf(GLfloat left,  GLfloat right,  GLfloat bottom,  GLfloat top,  GLfloat near,  GLfloat far);

void glFrustumx(GLfixed left,  GLfixed right,  GLfixed bottom,  GLfixed top,  GLfixed near,  GLfixed far);

 

函数参数:

left,right         指定左边和右边垂直切面的坐标

bottom,top    指定下边和上边水平切面的坐标

near,far         指定近端和远端深度切面的距离

描述:

glFrustum描述了一个产生透视投影的透视矩阵。这个矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:

通常,矩阵模式是GL_PROJECTION, 假设眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,  -near)指明了近切面的点,并且被映射到窗口的左下角和右上角。-far指明了远切面的位置。near 和 far都必须是正数

使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。

注意:

深度缓冲区的精度受到指定的near和far值的影响。far和near的比例越大,区分临近表面的有效深度缓冲区就越少。如果,

那么,将有大概位的深度缓冲区精度被丢失。因为,当near接近0的时候,r就接近于无穷,所以near一定不要设置为0.

错误:

GL_INVALID_VALUE         如果near和far不为整数,left等于right,top等于bottom,near等于far,那么将产生GL_INVALID_VALUE错误。

 

OpenGL ES之glOrtho函数

glOrtho—— 使用一个正交矩阵乘以当前矩阵 

函数原型:

void glOrthof(GLfloat left,  GLfloat right,  GLfloat bottom,  GLfloat top,  GLfloat near,  GLfloat far);

void glOrthox(GLfixed left,  GLfixed right,  GLfixed bottom,  GLfixed top,  GLfixed near,  GLfixed far);

函数参数:

left,right         指定左边和右边垂直切面的坐标

bottom,top    指定下边和上边水平切面的坐标

near,far         指定近端和远端深度切面的距离,如果面在观察者后面,这两个值都要为负数。

描述:

glOrtho描述了一个产生平行投影的变换。这个矩阵乘以当前矩阵的积,将代替当前矩阵,当glMultMatrix以如下参数被调用时:

通常,矩阵模式是GL_PROJECTION, 假设眼睛的位置在(0,0,0), (left, bottom, -near) 和 (right, top,  -near)指明了近切面的点,并且被映射到窗口的左下角和右上角。-far指明了远切面的位置。near 和 far可以是正数或负数。

使用 glPushMatrix 或 glPopMatrix来保存或恢复缩放前的坐标系统。

错误:

GL_INVALID_VALUE         如果left等于right,top等于bottom,near等于far,那么将产生GL_INVALID_VALUE错误。

OpenGL ES之glOrtho和glFrustum的区别

 

 glOrtho和glFrustum的参数是一样的,但是glFrustum的near和far参数都必须是整数并且near不能为0,而glOrtho的near和far参数没有这个限制。二者的left, right, bottom, top表达的意思是相同的,都是指某一切面的坐标位置。

        glOrtho表达的是正交矩阵,效果是2D的,就像你正对着一个立方体的某一个面看,所以它没有“近大远小”的效果。

        glFrustum表达的是透视矩阵,效果是3D的,它是一个平头锥体,具有“近大远小”的效果。

        所以,如果你要绘制2D效果,可以使用glOrtho,要绘制3D效果,使用glFrustum。由于计算3D需要复杂的计算,所以要开启深度测试。

CGBitmapContextCreate函数参数详解

函数原型:

当你调用这个函数的时候,Quartz创建一个位图绘制环境,也就是位图上下文。当你向上下文中绘制信息时,Quartz把你要绘制的信息作为位图数据绘制到指定的内存块。一个新的位图上下文的像素格式由三个参数决定:每个组件的位数,颜色空间,alpha选项。alpha值决定了绘制像素的透明性。

CGContextRef CGBitmapContextCreate (

   void *data,     指向要渲染的绘制内存的地址。这个内存块的大小至少是(bytesPerRow*height)个字节
   size_t width,     bitmap的宽度,单位为像素
   size_t height,      bitmap的高度,单位为像素
   size_t bitsPerComponent,    内存中像素的每个组件的位数.例如,对于32位像素格式和RGB 颜色空间,你应该将这个值设为8
   size_t bytesPerRow,             bitmap的每一行在内存所占的比特数
   CGColorSpaceRef colorspace,    bitmap上下文使用的颜色空间。
   CGBitmapInfo bitmapInfo        指定bitmap是否包含alpha通道,像素中alpha通道的相对位置,像素组件是整形还是浮点型等信息的字符串。

);

OpenGL ES之glTexImage2D函数

glTexImage2D—— 指定一个二维的纹理图片

纹理映射一个指定的纹理图像的每一部分到相应的图元中。调用带GL_TEXTURE_2D参数的glEnable和glDisable函数来启用和禁止二维材质贴图。默认,二维材质贴图是禁用的。

调用glTexImage2D来定义材质图片

函数原型:

void glTexImage2D(GLenum target,   指定目标纹理,这个值必须是GL_TEXTURE_2DGLint level,   执行细节级别。0是最基本的图像级别,你表示第N级贴图细化级别。GLint internalformat,  GLsizei width,  GLsizei height,  GLint border,  GLenum format,  GLenum type, const GLvoid * pixels);

函数参数:

target     指定目标纹理,这个值必须是GL_TEXTURE_2D。

level       执行细节级别。0是最基本的图像级别,你表示第N级贴图细化级别。

internalformat     指定纹理中的颜色组件,这个取值和后面的format取值必须相同。可选的值有

                    GL_ALPHA,
                    GL_RGB,
                    GL_RGBA,
                    GL_LUMINANCE, 
                    GL_LUMINANCE_ALPHA 等几种。

width     指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度

height     指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度

border    指定边框的宽度。必须为0。

format    像素数据的颜色格式,必须和internalformatt取值必须相同。可选的值有

                    GL_ALPHA,
                    GL_RGB,
                    GL_RGBA,
                    GL_LUMINANCE, 
                    GL_LUMINANCE_ALPHA 等几种。

type        指定像素数据的数据类型。可以使用的值有                    

                    GL_UNSIGNED_BYTE,
                    GL_UNSIGNED_SHORT_5_6_5,
                    GL_UNSIGNED_SHORT_4_4_4_4, 
                    GL_UNSIGNED_SHORT_5_5_5_1

pixels      指定内存中指向图像数据的指针

 

 

 

OpenGL ES之glShadeModel函数

glShadeModel—— 选择flat或smooth着色

函数原型:

void glShadeModel(GLenum mode)

函数参数:

mode   指明使用哪种着色技术,可以取值GL_FLAT和GL_SMOOTH。默认取值是GL_SMOOTH(颜色渐变)。

描述:

原文翻译太复杂,我在这里总结一下:在使用顶点数据绘制几何图形时,如果为每个顶点指定了顶点颜色,此时若使用GL_SMOOTH,每个顶点使用对应的顶点颜色来着色,而顶点之间的片元颜色则使用差值的方式来计算获得,结果就是渐变色;而若使用GL_FLAT,假设几何图形由n个三角形构成,则只会使用顶点颜色数组中最后n个颜色进行着色。

 

GL_SMOOTH着色模式

 

GL_FLAT着色模式

转载于:https://www.cnblogs.com/Anita9002/p/4931239.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C排序算法:(三)插入排序

像打扑克牌一样&#xff0c;每次摸一张牌&#xff0c;把牌插入正确位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

LeetCode Binary Tree Paths(简单题)

题意&#xff1a;   给出一个二叉树&#xff0c;输出根到所有叶子节点的路径。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判断是否到达了叶子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

新唐M0 KEIL环境搭建,找不到device不识别,关键:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;网上关于新唐的资料相对ST确实少得可怜&#xff0c;搭建环境也是搞了好久&#xff0c;去keil官网下载安装了新唐的pack 打开官方参考工程还是提示找不到device&#xff0c;option里面也没有识别出来。 百度了好久&#xff0c;尝试了各种办法&…

c语言有趣代码_【新课预知】——C语言程序设计

编者按&#xff1a;如今疫情这么严重&#xff0c;为了保护好自己&#xff0c;为了身边的人&#xff0c;大家可一定要听从国家号召——“宅”起来&#xff01;并且&#xff0c;小编们为了让大家伙“宅”得更加健康&#xff0c;可是费了不少脑筋呢&#xff0c;学哉数理公众号首次…

用R语言的quantreg包进行分位数回归

什么是分位数回归 分位数回归(Quantile Regression)是计量经济学的研究前沿方向之一&#xff0c;它利用解释变量的多个分位数&#xff08;例如四分位、十分位、百分位等&#xff09;来得到被解释变量的条件分布的相应的分位数方程。 与传统的OLS只得到均值方程相比&#xff0c;…

常规单元测试和存根–测​​试技术4

我的上一个博客是有关测试代码的方法以及讨论您要做和不需要进行测试的方法的一系列博客中的第三篇。 它基于我使用一种非常常见的模式从数据库中检索地址的简单方案&#xff1a; …并且我提出了这样的想法&#xff1a;任何不包含任何逻辑的类都不需要进行单元测试。 在其中&am…

中微CMS32 Keil环境搭建

打开中微官网https://www.mcu.com.cn/Products/113/pids/.html 把这三个资料都下载好。 环境搭建需要用的就是第三个pack包了 坑爹的是pack包下载下来是.zip格式 下载好后需要修改为.pack格式 运行即可。 打开三个资料中的demo code的工程 target和device都能识别出 编…

测试技巧–不编写测试

对此没有太多疑问&#xff0c;测试代码的方式是一个有争议的问题。 不同的测试技术因各种原因&#xff08;包括企业文化&#xff0c;经验和总体心理观点&#xff09;而受到不同开发人员的青睐。 例如&#xff0c;您可能更喜欢编写经典的单元测试&#xff0c;通过检查返回值来单…

Ubuntu镜像下载地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下载速度挺快的

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

题目链接&#xff1a;http://codeforces.com/contest/703/problem/D 给你n个数&#xff0c;m次查询&#xff0c;每次查询问你l到r之间出现偶数次的数字xor和是多少。 我们可以先预处理前缀和Xor[i]&#xff0c;表示1~i的xor和。因为num^num0&#xff0c;所以Xor[r] ^ Xor[l - 1…

九齐51单片机使用注意事项:不要用float

在使用ADC计算电压值时用了float&#xff0c;NY8B072A堆栈直接炸了&#xff0c;用32机习惯了&#xff0c;一直想不通&#xff0c;查了手册才知道。 手册是&#xff1a;《NYC_NY8_UM_v1.5_SC.pdf》 链接&#xff1a;https://www.nyquest.com.tw/cn/support/download/Nyquest_SW…

go 基准测试 找不到函数_基于Golang做测试

本文在实习期间完成并完善&#xff0c;无任何公司机密&#xff0c;仅做语言交流学习之用。持续更新。1.Golang的单元测试Go语言提供了丰富的单测功能。在Go中&#xff0c;我们通常认为函数是最小的可执行单元。本例中使用两个简单的函数&#xff1a;IsOdd和IsPalindrome来进行G…

九齐NY8B072A单片机使用笔记(三)模拟串口RX

因为这款单片机没有硬件串口&#xff0c;所以需要我们自己做软件模拟串口。 用PA3作为RX&#xff0c;因为PA3可以作为外部输入中断EXTI1。 本人首先用轮询的方式查PA3是否从高电平跳变到低电平&#xff08;起始信号&#xff09;&#xff0c;但是因为还有别的业务逻辑&#xf…

[LindCode] Binary Tree Postorder Traversal

Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes values. Example Given binary tree {1,#,2,3}, 1\2/3return [3,2,1]. Challenge Can you do it without recursion? SOLUTION 1: recursion&#xff1a; 分治法解决之&am…

金山毒霸垃圾清理

金山毒霸-垃圾清理-单文件封装,清洁洁癖的爱好&#xff01; 实话&#xff0c;金山的软件确实不错。展望金山可以在软件行业&#xff0c;做出让世界都使用的。为国人扛起一片天 下载地址&#xff1a; http://pan.baidu.com/s/1dFa7GdV转载于:https://www.cnblogs.com/xiaochina/…

python-break循环中断

Python break语句&#xff0c;就像在C语言中&#xff0c;打破了最小封闭for或while循环。 break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 如果您使用嵌套循环&am…

asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

下面开始在UserManager.Web中利用easyUI构建web。 1. 先删除自带的controllers、models和views&#xff08;里面的shared和web.config可以保存&#xff09;下面的文件 2. 要利用easyUI&#xff0c;首先去网上下载jquery-easyui-1.3.2.zip&#xff0c;同时下载一份EasyUI-1.3.2.…

adc如何获取周期_LOL:千珏拥有ADC最需要的位移和无敌能力,为什么没人用她打下路?...

— 点击蓝字 关注我们 —英雄联盟自国服上线以来&#xff0c;已经陪伴玩家走过了9个年头&#xff0c;目前英雄联盟中的英雄数量已经达到了151位&#xff0c;每一位都各具特色。千珏是一位深受玩家们喜爱的英雄&#xff0c;其在官方英雄的定位中&#xff0c;属于打野英雄&#x…

android surfaceview 大小_Android 使用Camera2 API采集视频数据

Android 视频数据采集系列的最后一篇出炉了&#xff0c;和前两篇文章想比&#xff0c;这篇文章从系统API层面进行一些探索&#xff0c;涉及到的细节更多。初次接触 Camera2 API 会觉得它的使用有些繁琐&#xff0c;涉及到的类有些多&#xff0c;不过就像第一次使用Activity, Fr…

使用Java VisualVM分析您的应用程序

当您需要发现应用程序的哪个部分消耗更多的CPU或内存时&#xff0c;必须使用探查器执行此操作。 默认情况下&#xff0c;Sun JDK中附带的一个探查器是Java VisualVM。 这个事件探查器非常简单易用&#xff0c;功能强大。 在这篇文章中&#xff0c;我们将看到如何安装它并使用它…