iOS OpenGL ES简单绘制纹理

OpenGL 中任何复杂的图形都是由点,线 和三角形组成的. 那么一个矩形 就需要有两个三角形组成.

纹理, 可以理解为一张图片, 我么可以将整张or部分图片绘制到圆形, 矩形等目标图形中.

下图表示了顶点数据 对应 的纹理中的点.

左侧代表定点数据, 其坐标原点是屏幕中央 ; 右侧图片(纹理), 坐标原点是左下角

GLKBaseEffect让我们避开了写shader Language 着色器语言, 相当于对glsl的封装
typedef struct {
    GLKVector3 positonCoords;//顶点
    GLKVector2 textureCoords;//纹理
}SceneVertex;

@interface GLViewController ()

@property(nonatomic,strong)GLKBaseEffect *baseEffect;
@property(nonatomic,assign)GLuint vertexBufferID;//缓存ID属性

@end

@implementation GLViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //1.创建OpenGLE ES上下文
    GLKView *view = (GLKView *)self.view;
    view.context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
    [EAGLContext setCurrentContext:view.context];

    //2.GLKBaseEffect属性, 使我们不需要编写shader language(着色器)代码就可以简单完成绘制
    self.baseEffect = [[GLKBaseEffect alloc]init];
    self.baseEffect.useConstantColor = GL_TRUE;//使用静态颜色绘制
    self.baseEffect.constantColor = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f);//设置绘制颜色 rgba
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//背景颜色

    //3.定点数据
    //矩形的六个顶点
    static const SceneVertex vertices[] = {
        {{1, -1, 0.0f,},{1.0f,0.0f}}, //右下
        {{1, 1,  0.0f},{1.0f,1.0f}}, //右上
        {{-1, 1, 0.0f},{0.0f,1.0f}}, //左上

        {{1, -1, 0.0f},{1.0f,0.0f}}, //右下
        {{-1, 1, 0.0f},{0.0f,1.0f}}, //左上
        {{-1, -1, 0.0f},{0.0f,0.0f}}, //左下
    };

    //4.生成缓存,并为缓存提供数据
    glGenBuffers(1, &_vertexBufferID);//申请一个标识符
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);//将标识符绑定到GL_ARRAY_BUFFER
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//复制定点数据从CPU 到 GPU

    glEnableVertexAttribArray(GLKVertexAttribPosition);//顶点缓存数据
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(SceneVertex), NULL + offsetof(SceneVertex, positonCoords));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(SceneVertex), NULL + offsetof(SceneVertex, textureCoords));

    //5.生成纹理
    //使用GLkit中的GLKTextureInfo方便的生成图片纹理。
    CGImageRef imageRef = [[UIImage imageNamed:@"1.png"]CGImage];
    //GLKTextureInfo封装了纹理缓存的信息,包括是否包含MIP贴图
    //option 防止图片是倒立了,这个是因为CoreGraphics的坐标系问题
    NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:@(1), GLKTextureLoaderOriginBottomLeft, nil];
    GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithCGImage:imageRef options:options error:nil];
    self.baseEffect.texture2d0.name = textureInfo.name;
    self.baseEffect.texture2d0.target = textureInfo.target;

    //6.代理, 绘制

}

//系统给我们回调的绘制消息,该方法会一直被调用,和display方法一致
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

    //清除背景色
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    [self.baseEffect prepareToDraw];
    glDrawArrays(GL_TRIANGLES, 0, 6);

}

- (void)dealloc{
    GLKView *view = (GLKView *)self.view;
    [EAGLContext setCurrentContext:view.context];
    if (_vertexBufferID != 0) {
        glDeleteBuffers(1, &_vertexBufferID);
        _vertexBufferID = 0;
    }

}

@end

原文地址:https://www.cnblogs.com/daxueshan/p/11132026.html

时间: 2024-10-03 17:52:14

iOS OpenGL ES简单绘制纹理的相关文章

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 的

[转] iOS OpenGL ES Guide

OpenGL ES 小结 概述 OpenGL ES (Open Graphics Library for Embedded Systems)是访问类似 iPhone 和 iPad 的现代嵌入式系统的 2D 和 3D 图形加速硬件的标准. 把程序提供的几何数据转换为屏幕上的图像的过程叫做渲染. GPU 控制的缓存是高效渲染的关键.容纳几何数据的缓存定义了要渲染的点.线段和三角形. OpenGL ES 3D 的默认坐标系.顶点和矢量为几何数据的描述提供了数学基础. 渲染的结果通常保存在帧缓存中.有两

初学Android OpenGL ES之使用纹理 八十三

在网上发现这些讲纹理的文章,非常不错 android 游戏导引(4. 简单纹理贴图) http://www.cnblogs.com/shengdoushi/archive/2011/01/13/1934181.html Android OpenGL es 纹理坐标设定与贴图规则 http://blog.csdn.net/cjkwin/article/details/6016224 Android OpenGL | ES给立方体进行纹理映射 http://www.ourunix.org/andro

Android OpenGL ES(七)----理解纹理与纹理过滤

1.理解纹理 OpenGL中的纹理可以用来表示图像,照片,甚至由一个数学算法生成的分形数据.每个二维的纹理都由许多小的纹理元素组成,它们是小块的数据,类似于我们前面讨论过的片段和像素.要使用纹理,最常用的方式是直接从一个图像文件加载数据. 每个二维纹理都有其自己的坐标空间,其范围是从一个拐角的(0,0)到另一个拐角的(1,1).按照惯例,一个维度叫做S,而另一个称为T.当我们想要把一个纹理应用于一个三角形或一组三角形的时候,我们要为每个顶点指定一组ST纹理坐标,以便OpenGL知道需要用那个纹理

对Android opengl ES世界坐标系和纹理坐标系的理解

初学opengl ES,每一个教你在屏幕上贴图的opengl版hello world都有这么两数组: static final float COORD[] = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, }; static final float TEXTURE_COORD[] = { 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; 但是几乎都不解释,所以我学的时候都不明白这些点

OpenGL ES 详解纹理生成和纹理映射步骤以及函数

通常一个纹理映射的步骤是: 创建纹理对象.就是获得一个新的纹理句柄 ID. 指定纹理.就是将数据赋值给 ID 的纹理对象,在这一步,图像数据正式加载到了 ID 的纹理对象中. 设定过滤器.定义了opengl现实图像的效果,如纹理放大时的马赛克消除. 绑定纹理对象.就是将 ID 的纹理作为下面操作的纹理. 纹理映射.将已绑定纹理的数据绘制到屏幕上去,在这一步,就能看到贴图的效果了. 一.opengl 中启用纹理映射功能 在默认设置中,纹理映射是关闭的,启用的参数是 GLTEXTURE2D, 还有其

Android OpenGL ES 应用(二) 纹理

上一篇讲了基础入门 OpenGL (一) ,这一次主要学习OpenGL 纹理基本学习总结 要是做复杂的OpenGL应用程序,一定会用到纹理技术.纹理说白了就是把图片或者视频图像绘制到OpenGL空间中. 因此纹理也有坐标系,称ST坐标,或者UV 上面是纹理坐标空间,但没有固定的方向 下面演示加载一张image作为纹理贴图. public class TextureUtils { public static int createTexture(InputStream ins) { int[] te

Android OpenGL ES(八)绘制点Point ..

上一篇介绍了OpenGL ES能够绘制的几种基本几何图形:点,线,三角形.将分别介绍这几种基本几何图形的例子.为方便起见,暂时在同一平面上绘制这些几何图形,在后面介绍完OpenGL ES的坐标系统和坐标变换后,再介绍真正的3D图形绘制方法. 在Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架 创建了示例应用的程序框架,并提供了一个“Hello World”示例. 为避免一些重复代码,这里定义一个所有示例代码的基类OpenGLESActivity,其定义如下:

OpenGL ES教程系列(经典合集)

为了搞透播放器的开发,花了些时间收集这些资料,虽然我已经搞定opengles渲染视频的内容,但是想玩玩opengles,往深里玩,图像处理这块是个好的方向,所以opengles是值得好好学的. OpenGL ES教程原创系列 2011-12-18[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 2011-12-17[iTyran原创]GLKit 矩阵变换:自转公转 2011-12-02[iTyran原创]Xcode创建的默认iOS OpenGL