Chapter5 基础纹理

Contents:
====================================================

| 任务     | 使用的函数
====================================================
| 载入纹理图像 | glTexImage / glTexSubImage
====================================================

| 设置纹理贴图参数 | glTexParameter
====================================================
| 管理多重纹理 | glGenTextures / glDeleteTextures / glBindTexture
====================================================
| 生成Mip贴图 | glGenerateMipmap
====================================================
| 使用各向异性过滤 | glGetFloatv / glTexParameter
====================================================
| 载入压缩纹理 | glCompressedTexImage / glCompressedTexSubImage
====================================================

5.1.1 像素包装
在默认情况下,OpenGL采用4个字节的对齐方式。
我们在向OpenGL提交图像数据或从OpenGL获取图像数据时,OpenGL需要知道我们想要在内存中对数据进行怎样的包装或解包装操作。

我们可以使用下列函数改变或者回复像素的存储方式。
void glPixelStorei(GLenum pname, GLint param);
void glPixelStoref(GLenum pname, GLfloat param);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 其中GL_UNPACK_ALIGNMENT指定OpenGL如何从数据缓存区中解包图像数据。

GL_PACK_ALIGNMENT : 告诉OpenGL如何将从像素缓冲区中读取并放置到一个用户指定的内存缓冲区的数据进行包装.

5.1.2 像素图
void glReadPixels(GLint x, GLint y ,GLSizei width, GLSizei height, GLenum format, GLenum type, const void *pixels);

5.1.3 包装的像素格式
默认情况下,对于GLReadPixels函数来说,读取操作在双缓冲区渲染环境下将在后台缓存区进行,而在单缓存区渲染环境下则在前台缓存区进行。我们可以使用下面函数改变这些像素操作的源。
void glReadBuffer(GLenum mode);
mode : GL_FRONT GL_BACK GL_LEFT GL_RIGHT GL_FRONT_LEFT GL_FRONT_RIGHT GL_BACK_LEFT GL_BACK_RIGHT 或者 GL_NONE

5.1.4 保存像素
GLTools库中的gltWirteTGA函数从前台颜色缓存区找那个读取颜色数据,并将这个数据存储到一个Targa文件格式的图形文件中。

GLint glWriteRGA(const char *szFileName)
{
FILE *pFile;
TGAHEADER tgaHeader;
unsigned long lImageSize;
GLbyte *pBits = NULL;
GLint iViewport[4];
GLenum lastBuffer;

//get viewport size
glGetIntegerv(GL_VIEWPORT, iViewport);

lImageSize = iViewport[2] * 3 * iViewport[3];

//alloc block
pBits = (GLbyte*)malloc(lImageSize);
if(pBits == NULL)
return 0;

//read from color buffer
glPixelStorei(GL_PACK_ALIGMENT, 1);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixekStorei(GL_PACK_SKIP_PIXELS, 0);

//获取当前读取缓冲区设置并进行保存
//切换到前台缓冲区并进行读取操作,最后恢复读取缓存区状态
glGetIntegerv(GL_READ_BUFFER, &lastBuffer);
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, iViewport[2], iViewport[3], GL_BRG, GL_UNSIGNED_BYTE, pBits);
glReadBuffer(lastBuffer);

//初始化Targa头
⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

//open file
pFile = fopen(szFileName, "wb");
if(pFile == NULL)
{
free(pBits);
return 0;
}

fwrite(&tgaHeader, sizeof(TGAHEADER), 1, pFile);
fwirte(pBites, lImageSize, 1, pFile);

free(pBits);
fclose((pFile);

return 1;
}

5.1.5 读取像素
从磁盘中载入Targa文件的函数
GLbyte *gltReadRGABits(const char* szFileName, GLint *iWidth, GLint *iHeght, GLint *iComponents, GLenum *eFormat);

5.2 载入纹理
void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border,GLenum format,GLenum type, void *data);
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border,GLenum format,GLenum type, void *data);
void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border,GLenum format,GLenum type, void *data);
【param】
target : GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D我们也可以指定代理GL_PROXY_TEXTURE_1D,⋯⋯并使用glGetTexParameter函数提取代理查询的结果
level: mip贴图层次

5.2.1 使用颜色缓冲区

一维和二维纹理也可以从颜色缓冲区加载数据。
void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat,GLint x, GLint y, GLsizei width, GLint border);
void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat,GLint x, GLint y, GLsizei width, GLint border);
void glCopyTexImage3D(GLenum target, GLint level, GLenum internalformat,GLint x, GLint y, GLsizei width, GLint border);

从颜色缓冲区读取纹理,并插入或替换原来纹理的一部分。
void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯
⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯

5.2.2 纹理对象
void glGenTextures(GLsizei n, GLuint *textures);
n: 纹理对象数量
texutres: 纹理对象指针

绑定纹理状态:
void glBindTexure(GLenum target, GLuint texture);
target: GL_TEXTURE_1D,GL_TEXTURE_2D或GL_TEXTURE_3D
texture: 需要绑定的特定纹理对象
此后,所有的纹理加载和纹理参数设置只影响当前绑定的纹理对象

删除纹理对象:
void glBindTexure(GLsizei n,GLuint *texture);

判断纹理对象(句柄)有效性:
GLboolean glIsTexture(GLuint texture);

5.3 纹理应用

5.3.1 纹理坐标

5.3.2 纹理参数
很多参数的应用都会影响渲染的规则和纹理贴图的行为;
void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
void glTexParameteri(GLenum target, GLenum pname, GLfloat param);
void glTexParameterfv(GLenum target, GLenum pname, GLfloat param);
void glTexParameteriv(GLenum target, GLenum pname, GLfloat param);

基本过滤:
根据一个拉伸或收缩的纹理贴图计算颜色片段的过程称为纹理过滤(Texture Fililtering).使用OpenGL的纹理参数函数,可以同时设置放大和缩小过滤器。这两种过滤器的参数名分别是
GL_TEXTURE_MAG_FILTER 和 GL_TEXTURE_MIN_FILTER。
我们可以从两种基本的过滤器GL_NEAREST 和GL_LINEAR中进行选择。

使用最邻近过滤的一个列子。使用下面两个函数,为放大和缩小过滤器设置纹理过滤器
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

线性过滤器:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

纹理环绕:

OpenGL chapter5 基础纹理的更多相关文章

  1. Android OpenGL ES(八)----纹理编程框架

    1.把纹理载入进OpenGL中 我们的第一个任务就是把一个图像文件的数据载入到一个OpenGL的纹理中. 作为開始.让我们又一次舍弃第二篇的框架.又一次创建一个程序,新建一个util工具包,在该包下创 ...

  2. Linux OpenGL 实践篇-5 纹理

    纹理 在之前的实践中,我们所渲染的物体的表面颜色都是纯色或者根据顶点位置计算出的一个颜色,这种方式在表现物体细节方面是比较吃资源的,因为我们每增加一个细节,我们就需要定义更多的顶点及其属性.所以美术人 ...

  3. OpenGL 多线程共享纹理

    1:opengl 多线程共享纹理纹理: //解码时候使用opengl进行绘制,需要构建队列和两个线程,分别用于解码数据并且填充纹理和渲染. 主线程常见两个共享上下文: main() { ⋯⋯⋯⋯ gH ...

  4. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...

  5. 【Unity Shader学习笔记】Unity基础纹理-单张纹理

    1 单张纹理 1.1 纹理 使用纹理映射(Texture Mapping)技术,我们把一张图片逐纹素(Texel)地控制模型的颜色. 美术人员建模时,会在建模软件中利用纹理展开技术把纹理映射坐标(Te ...

  6. Opengl ES之纹理贴图

    纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上.一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据. 所谓的纹理贴图,就是使用Opengl将 ...

  7. 04: OpenGL ES 基础教程03 纹理

    前言 1:常用类: 1:纹理的作用 正文 一:常用类 上下文 顶点数据缓存 着色器 baseEffect 一:纹理 1.1:   纹理可以控制渲染的每个像素的颜色. 1.2: 纹素:与像素一样,保存每 ...

  8. 2.x最终照着教程,成功使用OpenGL ES 绘制纹理贴图,添加了灰度图

    在之前成功绘制变色的几何图形之后,今天利用Openg ES的可编程管线绘制出第一张纹理. 学校时候不知道OpenGL的重要性,怕晦涩的语法.没有跟老师学习OpenGL的环境配置,现在仅仅能利用coco ...

  9. OpenGL chapter3 基础渲染

    3.1 基础图形管线 三种向OpenGl着色器传递渲染数据的方法:属性,Uniform和纹理.3.2 创建坐标系 3.2.1 正投影 GLFrustum::SetOrthographic(⋯⋯): 3 ...

随机推荐

  1. HDU 4864

    http://acm.hdu.edu.cn/showproblem.php?pid=4864 #include <iostream> #include <cstdio> #in ...

  2. 用于主题检测的临时日志(0ece3f5c-d74f-449c-85a7-ed53fffb0e94 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    这是一个未删除的临时日志.请手动删除它.(abf5973f-502f-47e6-8825-4dd1c2cdd799 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

  3. Eclipse中SVN的安装步骤(两种)和使用方法

    Eclipse中SVN的安装步骤(两种)和使用方法 一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方式.具体步骤如下: 方式一:手动安装 1.下载最新的Eclipse,我的 ...

  4. magento如何在首页显示产品

    1.首先现在magento后台创建一个新的分类,记下这个分类的 ID 号码.使用这个新建的分类来管理你的首页产品,这个分类设置为前台不可见.这样就不会显示在你的分类菜单中了,但使用代码调用的时候却会显 ...

  5. BZOJ3864: Hero meet devil【dp of dp】

    Description There is an old country and the king fell in love with a devil. The devil always asks th ...

  6. test20180907 day1

    T1 256MB,1Sec T2 512MB,3Sec T3 512MB,1Sec 总分:150 试题一 餐馆 题目背景 铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加. 题目描述 共有 ...

  7. leetcode:Reverse Words in a String【Python版】

    class Solution: # @param s, a string # @return a string def reverseWords(self, s): ss = s.split(&quo ...

  8. leetcode -day30 Reverse Linked List II

    1.  Reverse Linked List II  Reverse a linked list from position m to n. Do it in-place and in one- ...

  9. Git中特别的命令

    Rebase 假设我们的分支结构如下: rebase 会把从 Merge Base 以来的所有提交,以补丁的形式一个一个重新达到目标分支上.这使得目标分支合并该分支的时候会直接 Fast Forwar ...

  10. 【柚子木字幕組】【BBC】 Are Our Kids Tough Enough? Chinese School 英國的孩子足夠堅強嗎?中式教學

    https://www.youtube.com/watch?v=ypT6c4NZ6jk 最近很火的一个bbc纪录片 讲的是英国学校请几个中国老师到他们那里试行中国教育的故事 作为学习英文的素材很不错