OpenGL_ES2.0 -纹理

一:纹理基础:

1: 纹素的概念:

一个二维纹理在OpenGLES2.0中是非经常见的,二维纹理就是一个二维数组,每一个数据元素称为纹素,详细格式例如以下:

GL_RGB (Red, Green, Blue)

GL_RGBA (Red, Green, Blue, Alpha)

GL_LUMINANCE (Luminance即
亮度)

GL_LUMINANCE_ALPHA(Luminance, Alpha)

GL_ALPHA (Alpha)

2:纹理坐标概念:

3: 天空盒的概念:

天空盒由六个面组成。每一个面是一个二维纹理,纹理坐标的算法是由中心点取一条射线。与面的交点即是纹理坐标。

二:加载纹理和多级纹理技术

第一步: 创建纹理对象。

glGenTextures(GLsizein, GLuint *textures)

删除纹理对象。

glDeleteTextures(GLsizein, GLuint *textures)

第二步: 绑定纹理对象。

glBindTexture(GLenumtarget, GLuint texture)

第三步: 向显卡传输纹理数据

glTexImage2D(GLenumtarget, GLint level,

GLenuminternalFormat, GLsizei width,

GLsizeiheight, GLint border,

GLenumformat, GLenum type, const void* pixels)

代码样例:

//纹理对象句柄

GLuinttextureId;

//2 x 2 图像,3 字节 每一个像素(R,G, B)

GLubytepixels[4 * 3] =

{

    255,0,0,// 红

    0,255,0,// 绿

    0,0,255, // 蓝

    255,255,0// 黄

};

//使用紧密包装数据

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

//生成纹理对象

glGenTextures(1,&textureId);

//绑定纹理对象

glBindTexture(GL_TEXTURE_2D,textureId);

//加载纹理(向GPU传送)

glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, 2, 2, 0, GL_RGB,

GL_UNSIGNED_BYTE,pixels);

//设置纹理过滤(稍后会讲到)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);

三:纹理过滤和包装

非常多时候。我们把一个图片贴到一个模型上。并不刚好合适。那么就须要调整, 调整往往包括两个方面,大小缩放以及包装模式设置。

glTexParameteri(GLenumtarget, GLenum pname, GLint param)

glTexParameteriv(GLenumtarget, GLenum pname, const GLint *params)

glTexParameterf(GLenumtarget, GLenum pname, GLfloat param)

glTexParameterfv(GLenumtarget, GLenum pname, const GLfloat *params)

生成多级纹理。 在LOD中会用到:

glGenerateMipmap(GLenumtarget)



四:在片段着色器中使用纹理

在片段着色器中能够使用纹理。 详细使用过程例如以下:

第一步: 绑定到当前纹理, 然后帮当期纹理对象句柄传递给一致变量。

//找到一致变量

userData->samplerLoc= glGetUniformLocation(

userData->programObject,"s_texture");

//...

//绑定纹理对象

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D,userData->textureId);

//设置纹理对象句柄(纹理单元)到一致变量

glUniform1i(userData->samplerLoc,0);

第二步:写Shader,利用Shader提供的系统函数使用纹理 
texture2D(sampler2Dsampler, vec2 coord[,float bias])

GLbytevShaderStr[] =

"attributevec4 a_position;\n"

"attributevec2 a_texCoord;\n"

"varyingvec2 v_texCoord;\n"

"voidmain()

"{

"

gl_Position= a_position;

"

v_texCoord= a_texCoord;

"}

GLbytefShaderStr[] =

"precisionmediump float;\n"

"varyingvec2 v_texCoord;\n"

"uniformsampler2D s_texture;\n"

"voidmain()\n"

"{\n"

"gl_FragColor = texture2D(s_texture, v_texCoord); \n""}\n";

五:纹理子图指定

glTexSubImage2D(GLenumtarget, GLint level,

GLint xoffset,GLint yoffset,

GLsizei width,GLsizei height,

GLenum format,GLenum type, const void* pixels)

这个函数同意更新纹理图形的一部分,效率比glTexImage2D要高。

六:从颜色缓冲区读取纹理数据

这部分和帧缓冲区相关, 还与像素缓冲区相关,OpenGLES提供了两个函数同意从颜色缓冲区读取数据到纹理,假设进一步了解缓冲区知识的话。相信您会知  道開始像素缓冲区。拷贝过程效率更高一些。

glCopyTexImage2D(GLenumtarget, GLint level,

GLenuminternalFormat, GLint x,

GLint y,GLsizei width,

GLsizeiheight, GLint border )

glCopyTexSubImage2D(GLenumtarget, GLint level,

GLintlevel, GLint xoffset,

GLintyoffset, GLint x, GLint y,

GLsizeiwidth, GLsizei height)

OpenGL_ES-纹理的更多相关文章

  1. Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题

    Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...

  2. OpenGL: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...

  3. CSharpGL(10)两个纹理叠加

    CSharpGL(10)两个纹理叠加 本文很简单,只说明如何用shader实现叠加两个纹理的效果. 另外,最近CSharpGL对渲染框架做了修改,清理一些别扭的内容(DoRender()前后的事件都去 ...

  4. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  5. D3D三层Texture纹理经像素着色器实现渲染YUV420P

    简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...

  6. 【转】OpenGL多线程创建纹理,附加我的测试结果

    原文地址 http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html 关于这个问题以前只知道多个线程不能同时使用一个RC,结果为了能 ...

  7. Mipmap与纹理过滤

    为了加快渲染速度和减少纹理锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为Mipmap. 使用DirectX Texture Tool(DX自带工具)预生成Mipmap ...

  8. WebGL入门教程(五)-webgl纹理

    前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 WebGL入门教程(四)-webgl颜色 这里就需要用到 ...

  9. [转]各种移动GPU压缩纹理的使用方法

    介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法.1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列:1)Imagination Technologies的P ...

  10. [Unity] Shader(着色器)之纹理贴图

    在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...

随机推荐

  1. java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  2. unalias---取消命令别名

    unalias命令用来取消命令别名,是为shell内建命令. 选项 -a:取消所有命令别名. 实例 使用unalias命令将已经设置的命令别名"cc"取消,输入如下命令: unal ...

  3. api h5 sdk 接入的说明

    api 接入 :纯后台接入没有页面 h5接入: 有页面的接入  需要和客户交互 客户输入内容 sdk 接入:需要对方的sdk文件 植入文件

  4. python hmac 加密

    python2 :  key 是秘钥 类型为 str msg 要加密的文件 str digestmod 要加密的方式 python3: key 是秘钥 类型为 byte msg 要加密的文件 byte ...

  5. Windows学习总结(4)——Host文件的作用和如何修改Host文件

    本经验将为您介绍,什么是Host文件,Host文件作用,Host文件的位置等信息,以帮忙您了解Host文件. 方法/步骤 什么是HOST文件: Hosts是一个没有扩展名的系统文件,其基本作用就是将一 ...

  6. hdu5414(2015多校10)--CRB and String(字符串匹配)

    题目链接:pid=5414">点击打开链接 题目大意:有A.B两个字符串.如今有一种操作能够在A的随意一个字符x后面添加一个字符y(x.=y).问能不能将A变为B. 首先假设A能够变成 ...

  7. 洛谷P2147 [SDOI2008]Cave 洞穴勘测

    题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...

  8. Codeforces 919F. A Game With Numbers(博弈论)

      Imagine that Alice is playing a card game with her friend Bob. They both have exactly 88 cards and ...

  9. CODEVS——T1332 上白泽慧音 || 洛谷——P1726 上白泽慧音

    http://codevs.cn/problem/1332/|| https://www.luogu.org/problem/show?pid=1726#sub  时间限制: 1 s  空间限制: 1 ...

  10. 含有过滤功能的android流式布局

    FilterFlowLayout 含有过滤功能的流式布局, 參考FlowLayout 能够去除宽度不在范围(比例或真实值)内的子view 能够设置最大行数 能够加入组件间水平间距 能够加入行间距 系统 ...