opengl ES中的正交投影

由于设备使用的归一化坐标系与像素无关,范围在三个方向上都是-1~1,所以直接硬编码绘制图元的时候可能会因为设备像素问题产生横向或是竖向被压缩(扭曲)。

书中的解决方法是将操作放在一个虚拟坐标空间中,就是我们设计顶点数值的时候假象自己就是在虚拟坐标空间中进行的,至于如何映射到设备上,可以不必考虑。

正交投影是一种将一个空间区域投影到一个二维平面上的方法(投影就是把高维降到地位的过程),这里所说的这个空间区域是一个无论多远去看物体的大小都不会变得一个三维空间中的区域,超过这个区域的部分不能被看到。

使用正交投影矩阵的目的是将我们操作的虚拟坐标空间映射到设备屏幕上,构造好了之后在顶点着色器代码中给顶点位置赋值的之前都乘上这个正交投影矩阵就可以直接转化坐标了。

由于设备使用的是左手坐标系,但是在opengl绘制的时候使用默认是右手坐标系,因此在正交矩阵的设定中,需要把近/远的定义颠倒,

final float aspectRatio = width > height ? (float)width/(float)height : (float)height/(float)width;
        if(width > height){
            orthoM(projectionMatrix,0,-aPositionLocation,aspectRatio,-1f,1f,-1f,1f);
        }else{
            orthoM(projectionMatrix,0,-1f,1f,-aspectRatio,aspectRatio,-1f,1f);
        }

这就是在onSurfaceChanged中通过设备分辨率进行设置的,那个orthoM的方法是Android提供的构建正交矩阵的一个方法,会把结果保存在projectionMatrix(float[16])中

此时在顶点着色器中加入一个矩阵:

uniform mat4 u_Matrix;
attribute vec4 a_Position;

void main() {
    gl_Position = u_Matrix * a_Position;
}

然后再绘制之前加入绑定数据的方法:

@Override
    public void onDrawFrame(GL10 gl) {
        glClear(GL_COLOR_BUFFER_BIT);
        glUniformMatrix4fv(uMatrixLocation,1,false,projectionMatrix,0);
        glUniform4f(uColorLocation,1.0f,1.0f,0.0f,1.0f);
        glDrawArrays(GL_TRIANGLE_STRIP,0,8);
        glUniform4f(uColorLocation,0.0f,1.0f,1.0f,1.0f);
        glDrawArrays(GL_TRIANGLE_STRIP,8,8);
    }

这是一个绘制立方体程序,一开始绘制的时候显示这样:

加入矩阵之后是这样:

实际上这个正方形应当是这样放置的(懒得画了,在虚幻上截个图来看):

下一步就是研究矩阵变换作用到这个空间上了,看看能不能做一个自动旋转的立方体。

时间: 2024-10-12 10:12:44

opengl ES中的正交投影的相关文章

【Android应用开发】 OpenGL ES -- 透视投影 和 正交投影

博客地址 : http://blog.csdn.net/shulianghan/article/details/46680803 源码下载 : http://download.csdn.net/detail/han1202012/8903437 正交投影效果 :  透视投影效果 :  一. 投影简介 1. 摄像机位置 摄像机参数 : -- 摄像机位置 : 摄像机的 三维坐标位置 x, y, z 坐标; -- 观察方向 : 摄像机镜头的朝向, 是一个三维向量, 指向一个三维坐标方向; -- up

OpenGL ES总结(六)OpenGL ES中EGL

Agenda: EGL是什么? EGL数据类型 EGL在Android中应用 EGL的工作流程 GLSurfaceView与EGL区别 简单Demo EGL是什么? EGL? is an interface between Khronos rendering APIs such as OpenGL ES or OpenVG and the underlying native platform window system. It handles graphics context managemen

opengl ES中的透视

由于正交投影的局限性,他只能保证适应屏幕宽高比,但是无法在一定范围内创建出将三维效果转换为二维效果,因此我们使用在绘画艺术中使用的一种技巧: (关于透视方法下面有个网站介绍的不错,配图也很容易懂:http://www.artyfactory.com/index.html ) 因为我们去掉了正交投影,准备使用透视投影,因此有必须要说明透视投影的一些特征. 透视投影有一个名为视锥体的特殊名词,这个的简介有一位博主的介绍相当不错: http://www.cnblogs.com/graphics/arc

OpenGL ES 中的模板测试

模板测试的主要功能是丢弃一部分片元,相对于深度检测来说,模板测试提出的片元数量相对较少.模板测试发生在剪裁测试之后,深度测试之前. 使用模板测试时很重要的代码提示: 1 1.glClear( GL_STENCIL_BUFFER_BIT); 2 //启用模板测试 3 2.glEnable(GL_STENCIL_TEST); 大多数情况你的模板遮罩(stencil mask)写为0x00或0xFF就行. 1 // 0xFF == 0b11111111,此时,模板值与它进行按位与运算结果是模板值,模板

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)

OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--OpenGL ES的基本用法.绘制流程与着色器编译>中实现了OpenGL ES的Android版HelloWorld,并且阐明了OpenGL ES的绘制流程,以及编译着色器的流程及注意事项.本文将从现实世界中图形显示的角度,说明OpenGL ES如何使得图像在移动设备上显示的更加真实.首先,物体有各种颜色

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘 在OpenGL .OpenGL ES中矩阵起着举足轻重的作用,而矩阵之间的左乘与右乘在效果上是不同的. 一.先平移后旋转 场景效果:人绕树旋转. 原理:以树为参考点,首先将人平移到树坐标系的指定位置(平移矩阵),然后旋转一定角度(旋转矩阵). 公式: pos = (matRotate * matTrans * vec4(pos,1.0)).xyz; 其中matRotate表示旋转矩阵: matTrans表示平移矩阵: pos表示三维世界的坐标.

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)

在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerColor元素到游戏中: autolayerColor = LayerColor::create(Color4B(255, 0, 0, 255), 100, 100); layerColor->setPosition(100,100); 下面是LayerColor::create方法: LayerColo

OpenGL ES 简单教程

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. OpenGL ES 定义了一个在移动平台上可以支持OpenGL最基本功能的精简标准.以适应如手机.PDA或其他消费者移动终端的显示系统. Khronos Group 定义和管理了OpenGL ES标准. OpenGL 与 OpenGL ES的关系OpenGL ES 是基于桌面版本号OpenGL 的