OpenGL_ES-纹理

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)

时间: 2024-11-05 18:57:58

OpenGL_ES-纹理的相关文章

使用 PVRTC 压缩格式创建纹理(Creating textures in the PVRTC compression format)

使用 PVRTC 压缩格式创建纹理(Creating textures in the PVRTC compression format) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 有关该篇

OpenGL学习笔记4:纹理

原始图像数据 像素包装 图像数据在内存中很少以紧密包装的形式存在.在许多硬件平台上,处于性能上的考虑,一幅图像的每一行都应该从一种特定字节对齐地址开始.绝大多数编译器会自动把变量和缓冲区放置在一个针对该架构对齐优化的地址上. 例如一个包含3个分量的rgb图像,每个分量存储在一个字节中,如果图像有199个像素,那么一行需要597个像素.如果硬件本身的体系结构是4字节排列,那么图像每一行的末尾将由额外的3个空字符进行填充达到600字节. 我们可以使用下列函数改变或者回复像素的存储方式. void g

OpenGL蓝宝书第六章代码疑虑:为什么使用了GL_TEXTURE_1D??纹理和顶点间的映射是如何实现?

遇到一个大问题,明明加载纹理绑定的是GL_TEXTURE_2D glUniform1i(locCloudTex, 1); //明明默认为0,参数却不是0. 可是原书中代码确是 glGenTextures(1, &uiTexture); glBindTexture(GL_TEXTURE_1D, uiTexture); // LoadTGATexture("Clouds.tga", GL_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE); glUniform

CUDA学习日志:常量内存和纹理内存

接触CUDA的时间并不长,最开始是在cuda-convnet的代码中接触CUDA代码,当时确实看的比较痛苦.最近得空,在图书馆借了本<GPU高性能编程 CUDA实战>来看看,同时也整理一些博客来加强学习效果. Jeremy Lin 在上一篇博文中,我们谈到了如何利用共享内存来实现线程协作的问题.本篇博文我们主要来谈谈如何利用常量内存和纹理内存来提高程序性能. 常量内存 所谓的常量内存,从它的名字我们就可以知道,它是用来保存在核函数执行期间不会发生变化的数据.NVIDIA硬件提供了64KB的常量

DXVA2解码数据用texture纹理渲染

FFmpeg DXVA2解码得到的数据使用surface来承载的,surface限制很多,如果能用纹理来渲染的话,那我们就可以充分开发D3D,比如可以用坐标变换来实现电子放大的功能,还可以用坐标变换来实现视频图像任意角度的旋转等功能.而对于我来说,最重要的是纹理渲染可以使得解码后的数据能够用像素着色器来做简单的视频图像处理,如果是用的是D3D11,对于更为复杂的视频图像处理算法也是有望可以用Compute Shader实现,以便充分利用显卡来加速和释放CPU. DXVA2解码数据用纹理渲染的方法

Halcon编程-基于纹理的mara检测

表面瑕疵检测是机器视觉领域非常重要的一个应用.机器视觉是集光学.机电和计算机三个领域的一门不算新的技术.但目前表面瑕疵检测在学界主要是计算机专业或者控制专业瞄准图像处理方向在做,而视觉光学系统这一块主要是光学工程专业在做.很少有研究者把这三块都结合的很好,而国内做这机器视觉(注意是机器视觉 不是计算机视觉)基本上都是小公司. 软件这一块就不说了,国内的整体软件环境不好.据我所知,日本.德国和美国在机器视觉方面有很多相对成熟的软件.中国农业大学的陈兵旗教授在留日期间弄过很多机器视觉方面的农业机器人

Cg入门21:Fragment shader - 2D纹理采样

体纹理:是啥? tex2D 以前只能在Fragment程序中纹理采样 UV坐标系:其实点为左下角,范围为[0,1],U为x轴,V为y轴 Texture.wrapMode 循环模式: TextureWrapMode.Clamp:设置纹理充满拉伸使用 TextureWrapMode.Repeat:纹理重复平铺使用 如果采用Repeat,那么等于U>=1的情况就会用纹理图在右边在平铺一张图 Texture.filterMode 过滤模式: Point:像素过滤(不进行过滤 ) Bilinear:双线性

Nico Game Studio 3.地图纹理编辑 物体皮肤编辑

完成功能: 1.地图纹理编辑功能. 图层编辑,添加/删除纹理,地图编辑.网格绘制. 2.物体编辑器:皮肤编辑器. 这块内容比较多: 动态纹理编辑器: 单个皮肤的编辑器. 编辑帧序列,预览动画. 进度实在慢的可以.. 控件和窗体等关于界面的美化,打算放在后面做. 下面的安排 1:完成地图编辑器的功能. 包括:物体,单位,技能编辑器; 以及在地图上放置物体和单位;多地图编辑的功能. 2:完成交互功能. 包括:地图物理属性构建, 玩家控制的角色移动 , 可交互物体的功能实现. 3:游戏基础逻辑实现.

Nico Game Studio 2.设置页面读写 纹理载入与选择

进度十分之慢... 配置读写一样采用之前写的自动绑定的方法: 分享一下代码: SetControl是把数据写到control上的. SetObject是把数据写到对象上 GetData是从控件读取数据,并获得包含这些数据的实例; public static void SetControl(this Control control, object data) { var type = data.GetType(); Dictionary<string, object> values = new

SDL2源码分析5:更新纹理(SDL_UpdateTexture())

===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源码分析2:窗体(SDL_Window) SDL2源码分析3:渲染器(SDL_Renderer) SDL2源码分析4:纹理(SDL_Texture) SDL2源码分析5:更新纹理(SDL_UpdateTexture()) SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy()) SDL2源