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,一经查实,立即删除!

相关文章

忽略Java中的自签名证书

我在职业生涯中遇到过几次问题,就是我们有时希望允许自签名证书用于开发或测试目的。 Google的快速搜索显示了多年来无数Java开发人员遇到的麻烦。 根据确切的证书问题,您可能会收到类似以下内容之一的错误,尽管我几乎肯定有其他表现形式&…

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 …

sqlserver中自定义函数+存储过程实现批量删除

由于项目的需要&#xff0c;很多模块都要实现批量删除的功能。为了方便模块的调用&#xff0c;把批量删除方法写成自定义函数。直接上代码。 自定义函数&#xff1a; ALTER FUNCTION [dbo].[func_SplitById] (str varchar(50),split varchar(10))--传过来的id字符串 --分割的标…

c语言选择排序_C语言——选择排序

1 选择排序&#xff08;5分&#xff09;题目内容&#xff1a;编写选择排序&#xff0c;要求排序过程调用函数实现&#xff0c;在主函数输入n个数据&#xff0c;调用函数后&#xff0c;输出排好序的元素输入格式:输入整型数n&#xff0c;并输入n个整数&#xff0c;输入数据用空格…

算法—巧排扑克牌(C语言)

/*小明刚上小学&#xff0c;学会了第一个扑克牌“魔术”&#xff0c;到处给人表演。魔术的内容是这样的&#xff1a;他手里握着一叠扑克牌&#xff1a;A&#xff0c;2&#xff0c;....J&#xff0c;Q&#xff0c;K 一共13张。他先自己精心设计它们的顺序&#xff0c;然后正面朝…

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 * …

我的测试和代码分析工具箱

上周&#xff0c;我们在LINEAS成立了一个“测试技能小组”&#xff0c;该小组用于交换有关测试的知识。 各种各样的问题反复出现的一个问题是&#xff1a;有哪些工具可以测试和分析您的代码&#xff1f; 因此&#xff0c;这是我对此的个人回答&#xff0c;按照我倾向于将其介绍…

新唐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;…

算法—快速排序Sqrt (C语言)

/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const void* b) {return (*(int *)a-*(int *)b); }int main() {int i,a[]{32,29,59,8,22,68,89,77},n;nsizeof(a)/sizeof(a[0]);printf("排序前:\n");for(i0;i&…

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

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

中微CMS32 Keil环境搭建

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

Windows下sass无法编译

最近windows下使用sass老是出现各种莫名其买的问题&#xff0c;下面是我的一些解决办法 windows下编译sass不支持中文解决办法网上给的是 解决办法&#xff1a; 1.koala可视化编译工具&#xff0c; 找到安装目录里面sass-3.3.7模块下面的engine.rb文件&#xff0c;例如下面路径…

数据库面试中常用的10个问题

1&#xff0e;触发器的作用&#xff1f;答&#xff1a;触发器是一中特殊的存储过程&#xff0c;主要是通过事件来触发而被执行的。它可以强化约束&#xff0c;来维护数据的完整性和一致性&#xff0c;可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如&…

测试技巧–不编写测试

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

Ubuntu镜像下载地址

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

算法—实现排列 A(n,m)

/* 实现排列A&#xff08;n,m&#xff09;*/ #include "stdio.h" int m,n,a[30]; long s0; int main() {int p(int k);printf("input n(n<10):"); scanf("%d",&n);printf("input m(<1m<n):"); scanf("%d",&…

oracle忘记用户密码

在cmd命令行下输入sqlplus / as sysdba alter user system identified by abc; 就可以将system用户的密码改成abc了。 alter user sys identified by abc; sys用户的密码也改成abc了。 然后你再登录sqlplus: 转载于:https://www.cnblogs.com/zzlp/p/4936109.html

python初体验-hello world答案_Python初体验_基础(一)

一&#xff1a;变量 变量的赋值&#xff1a; name “Meng” 上述代码声明了一个变量&#xff0c;变量名为name&#xff0c;变量name的值为&#xff1a;”Meng“ 变量定义&#xff1a; 一个在内存存数据的容器。 变量的意义&#xff1a; 保存程序执行的中间结果或状态&#xff…