美文网首页
OpenGL ES 学习笔记三之纹理

OpenGL ES 学习笔记三之纹理

作者: 春雨霏霏_____ | 来源:发表于2017-08-25 20:03 被阅读0次

纹理贴图:

// 列出所有不同顶点,根据索引读取

GLfloat verticesIndex[] = {

0.5, -0.5, 0.0f,    1.0f, 0.0f, //右下(x,y,z坐标 + s,t纹理)

-0.5, 0.5, 0.0f,    0.0f, 1.0f, //左上

-0.5, -0.5, 0.0f,  0.0f, 0.0f, //左下

0.5, 0.5, 0.0f,    1.0f, 1.0f, //右上

};

GLfloat textureVertices[] = {

1.0f, 0.0f,

0.0f, 1.0f,

0.0f, 0.0f,

1.0f, 1.0f,

};

GLuint indices[] = { // 注意索引从0开始!

0,1,2, // 第一个三角形

1,3,0 // 第二个三角形

};

- (void)configVBOs

{

//顶点数据缓存

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(verticesIndex), verticesIndex, GL_STATIC_DRAW);

GLuint indicesBuffer;  //索引数组

glGenBuffers(1, &indicesBuffer);  //申请一个标识符(索引数组buffer)

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);

//GL_STATIC_DRAW表示此缓冲区内容只能被修改一次,但可以无限次读取。

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

//开启对应的顶点属性

glEnableVertexAttribArray(GLKVertexAttribPosition); //顶点数组缓存

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 0);

//为vertex shader的Position和TexCoord0配置合适的值

glEnableVertexAttribArray(GLKVertexAttribTexCoord0); //纹理

glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 3);

//    纹理顶点数据单独缓存

//    GLuint bufferTexture;

//    glGenBuffers(1, &bufferTexture);

//    glBindBuffer(GL_ARRAY_BUFFER, bufferTexture);

//    glBufferData(GL_ARRAY_BUFFER, sizeof(textureVertices), textureVertices, GL_STATIC_DRAW);

//

//    //为vertex shader的Position和TexCoord0配置合适的值

//    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); //纹理

//    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, (GLfloat *)NULL);

}

对于定点位置的读取之后,设置纹理的顶点坐标,既可以进行组合读取,也可以进行单独缓存读取,建议组合读取。

//创建着色器效果

- (void)setupBaseEffect{

//    GLKTextureLoader读取图片,创建纹理GLKTextureInfo

UIImage *imageTexture = [UIImage imageNamed:@"chunyu"];

//GLKTextureLoaderOriginBottomLeft 参数是避免纹理上下颠倒,原因是纹理坐标系和世界坐标系的原点不同。

NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], GLKTextureLoaderOriginBottomLeft, nil];

//加载图片

GLKTextureInfo* textureInfo = [GLKTextureLoader textureWithCGImage:imageTexture.CGImage options:options error:nil];

//    创建着色器GLKBaseEffect,把纹理赋值给着色器

self.mEffect = [[GLKBaseEffect alloc] init];

self.mEffect.texture2d0.enabled = GL_TRUE;

self.mEffect.texture2d0.name = textureInfo.name;

}

着色器对纹理素材进行读取,既可以读取资源路径,也可以直接读取CGImage对象。

效果如下:

相关文章

  • OpenGL ES 学习笔记三之纹理

    纹理贴图: // 列出所有不同顶点,根据索引读取 GLfloat verticesIndex[] = { 0.5,...

  • OpenGL ES学习笔记3:纹理效果设置

    在上一篇OpenGL ES学习笔记2: 使用shader(着色器)展现图片中介绍了纹理环绕和纹理过滤的概念和设置,...

  • OpenGL ES之纹理(三)

    什么是纹理 纹理是一个用来保存图像的颜色色素值得OpenGL ES缓存, 纹理的作用是为了使我们渲染的几何图像更加...

  • OpenGL ES学习之纹理贴图

    OpenGL ES学习之纹理贴图 基本原理 启用纹理映射功能后,如果想把一副纹理应用到相应的几何图元,就必须告知渲...

  • OpenGL ES学习笔记(四):纹理

    基本概念 ** 纹理 **概念:纹理是一个用来保存图像颜色元素值的OpenGL ES缓存。应该尽量使用最小的图像来...

  • OpenGL坐标概念

    openGL 顶点,坐标系,纹理坐标Android OpenGL es 纹理坐标设定与贴图规则对Android o...

  • OpenGL之纹理及应用案例

    纹理介绍 OpenGL使用的图片数据(纹理)都是tga格式的,而iOS/OpenGL ES使用PNG/JPEG格式...

  • OpenGL ES之纹理

    之前只是用OpenGL ES来渲染出一个很单调的白色三角形, 但生活中却又千千万万种颜色, 还有些东西是由很多颜色...

  • 学习OpenGL ES之基本纹理

    本系列所有文章目录 获取示例代码 纹理通常来说就是一张图片,我们为每一个顶点指定纹理坐标,然后就可以在Shader...

  • OpenGL ES学习笔记(三):纹理相关概念

    纹理映射到转换后的顶点 纹理 概念:纹理是一个用来保存图像颜色元素值的OpenGL ES缓存。 应该尽量使用最小的...

网友评论

      本文标题:OpenGL ES 学习笔记三之纹理

      本文链接:https://www.haomeiwen.com/subject/dmuudxtx.html