OpenGL ES2 學習教程7——紋理

 紋理 texture

  • 2D紋理git

2D紋理是一個二維的圖像數據陣列,貼圖的座標寫做(s,t)圖像的左下角是座標(0,0)。github

  • 立方體紋理算法

由六個獨立的2d紋理組成的,在3D渲染時有頗有不少優勢,最基本的用法是環境映射。less

  • 紋理對象函數

貼圖應用的第一步是建立紋理對象。貼圖對象是包含一個圖片數據過濾模型包裝模型等用於貼圖數據的容器。優化

void glGenTextures(GLsizei n, GLuint *textures)
void glDeleteTextures(GLsizei n, GLuint *textures)

n是指定貼圖對象的數量。textures指針存儲貼圖對象id值的句柄。建立對象後須要綁定和裝載數據到對象,綁定使用glBindTexture;基本的裝載數據是glTexImage2D。ui

void glBindTexture(GLenum target, GLuint texture)
void glTexImage2D(GLenum target, GLint level, GLenum internalFormat, 
                  GLsizei width, GLsizei height, GLint border, 
                  GLenum format, GLenum type, const void* pixels)

glBindTexture:target綁定貼圖對象到目標GL_TEXTURE_2D或GL_TEXTURE_CUBE_MAP;texture是紋理對象句柄。spa

glTexImage2D:target指定對象目標,GL_TEXTURE_2D或者立方體紋理的一個面(如GL_TEXTURE_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X等),level裝載mip級別(mip之後會講到)最低級別是0,後續的級別是遞增的,internalFormat存儲內部格式(GL_RGBA,GL_RGB,GL_LUMINANCE_ALPHA,GL_LUMINANCE,GL_ALPHA),width height是圖像寬高。border指定邊框的寬度,必須爲0。format指定像素數據的顏色格式,必須和internalFormat相同。type指定像素數據的數據類型,可選值:GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_4_4_4_4 GL_UNSIGNED_SHORT_5_5_5_1 GL_UNSIGNED_SHORT_5_6_5。pixels指定內存中指向圖像數據的指針。指針

  • 紋理數據code

void glPixelStorei(GLenum pname, GLint param);

設定像素存儲模式,pname指定要設置參數的符號名。有兩種GL_PACK_ALIGNMENT它影響將像素數據寫回到主存的打包形式,對glReadPixels的調用產生影響。GL_UNPACK_ALIGNMENT它影響從主存讀到的像素數據的解包形式,對glTexImage2D以及glTexSubImage2D產生影響;param指定相應的pname的值,這個值通常是一、二、4或8,用於指定存儲器中每一個像素行有多少個字節對齊。對齊的字節數越高,系統就越能優化。

  • 設置紋理參數

void glTexParameteri(GLenum target, GLenum pname, GLint param);

target指定紋理類型,pname能夠是GL_TEXTURE_MIN_FILTER縮小狀況,GL_TEXTURE_MAG_FILTER放大狀況。param是給pname指定算法,GL_NEAREST是最鄰近算法,GL_LINEAR是雙線性插值算法。

  • 着色器中的使用

片斷着色器能夠聲明sampler2D,samplerCube的uniform採樣器,分別對應2D紋理和立方體紋理。採樣器uniform將裝載指定的已經綁定過的貼圖單元。指定貼圖綁定到貼圖單元的方法是glActiveTexture函數。

void glActiveTexture(GLenum texture)

texture激活的貼圖單元,GL_TEXTURE0,GL_TEXTURE1等。設定當前的貼圖單元,以致後面將使用glBindTexture來綁定貼圖到當前的單元。最大貼圖數目可使用GL_MAX_TEXTURE_IMAGE_UNITS爲參數調用glGetIntegeriv查詢。

片斷着色器使用內建函數 textureCube 去進行貼 圖,法線做爲貼圖座標。

vec4 textureCube(samplerCube sampler, vec3 coord[,float bias])

sampler綁定到貼圖單元的採樣器,指定獲取的貼圖;coord被用於立方體貼圖的3D貼圖座標;bias用於獲取貼圖提供多級紋理偏置的可選參數,容許着色器解釋計算LOD值的偏置,被用於多級紋理選擇。

2D紋理栗子

建立部分的代碼以下,完整代碼請前往github的tag:lesson7。

// shader:
static const char gVertexShader[] =
    "attribute vec4 a_position;   \n"
    "attribute vec2 a_texCoord;   \n"
    "varying vec2 v_texCoord;     \n"
    "void main()                  \n"
    "{                            \n"
    "   gl_Position = a_position; \n"
    "   v_texCoord = a_texCoord;  \n"
    "}                            \n";

static const char gFragmentShader[] =
    "precision mediump float;                            \n"
    "varying vec2 v_texCoord;                            \n"
    "uniform sampler2D s_texture;                        \n"
    "void main()                                         \n"
    "{                                                   \n"
    "  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
    "}                                                   \n";

// create texture:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, gPixels);
// Set the filtering mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

gPixels是一個寬高都爲2的GLubyte矩陣,這裏圖像大小會被放大,放大采用最鄰近算法。

clipboard.png

相關文章
相關標籤/搜索