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)
OpenGL_ES-纹理的更多相关文章
- Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题
Html5 中获取镜像图像 - 解决 WebGL 中纹理倒置问题 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...
- OpenGL: 纹理采样 texture sample
Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...
- CSharpGL(10)两个纹理叠加
CSharpGL(10)两个纹理叠加 本文很简单,只说明如何用shader实现叠加两个纹理的效果. 另外,最近CSharpGL对渲染框架做了修改,清理一些别扭的内容(DoRender()前后的事件都去 ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
- 【转】OpenGL多线程创建纹理,附加我的测试结果
原文地址 http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html 关于这个问题以前只知道多个线程不能同时使用一个RC,结果为了能 ...
- Mipmap与纹理过滤
为了加快渲染速度和减少纹理锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为Mipmap. 使用DirectX Texture Tool(DX自带工具)预生成Mipmap ...
- WebGL入门教程(五)-webgl纹理
前面文章: WebGL入门教程(一)-初识webgl WebGL入门教程(二)-webgl绘制三角形 WebGL入门教程(三)-webgl动画 WebGL入门教程(四)-webgl颜色 这里就需要用到 ...
- [转]各种移动GPU压缩纹理的使用方法
介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法.1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列:1)Imagination Technologies的P ...
- [Unity] Shader(着色器)之纹理贴图
在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...
随机推荐
- Android 使用开源库载入网络图片
Android 使用开源库载入网络图片,使用开源库载入图片.单击listview弹出popupwindow弹出框详情查看: Android 单击listview弹出popupwindow弹出框 ,里面 ...
- SSO 中间件 kisso
SSO 中间件 kisso kisso = cookie sso,基于 Cookie 的 SSO 中间件.kisso 不是一套完整的登录系统, 它的定位是一把高速开发 java Web 单点登录系 ...
- 计蒜客 429(腾讯手机地图-pi的精确值)
腾讯手机地图的定位功能用到了用户手机的多种信号.这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的.有的则是在不论什么一个方向上信号强度都一致的. 已知 ...
- 使用 Bluemix™ Live Sync 高速更新 Bluemix 上执行的应用程序实例
假设您要构建 Node.js 应用程序,那么能够使用 IBM® Bluemix® Live Sync 高速更新 Bluemix 上的应用程序实例,并像在桌面上进行操作一样进行开发,而无需又一次部署.执 ...
- Kali Linux下安装VMware Tools
引言 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透測试.安装Kali Linux非常easy,可是安装VMware Tools的过程就有点麻烦了,由于在安装中途会 ...
- DIV+CSS两种盒子模型(W3C盒子与IE盒子)
在辨析两种盒子模型之前.先简单说明一下什么叫盒子模型. 原理: 先说说我们在网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS ...
- 洛谷 P2978 [USACO10JAN]下午茶时间Tea Time
P2978 [USACO10JAN]下午茶时间Tea Time 题目描述 N (1 <= N <= 1000) cows, conveniently numbered 1..N all a ...
- mysql中load data Infile运用
速度比insert要快20倍.共享一下java程序操作. package com.mysql.csv; import java.sql.Connection; import java.sql.Driv ...
- kibana中信息分类查询显示的方法
1.什么是kibana? kibana是ELK(elasticsearch+logstash+kibana)中的K,它是一个可灵活的分析和可视化平台,主要是显示数据以及根据这些数据绘出一些可视化图表, ...
- 如何把excel同一个单元格内的文字和数字分别提取出来?
平台:excel 2010 目的:把excel同一个单元格内的文字和数字分别提取出来 操作: 假设数据在A1单元格:如果文字在前,B1=left(A1,lenb(A1)-len(A1))可得文字,C1 ...