glTexImage*D

glteximage-d.png

glTexImage2D(GL_TEXTURE_2D,level,internalFormat,width,height,border,format,テクスチャデータのポインタ)

internal format
どの成分(RGBA,デプス、輝度、強度)が画像のテクセルとして選ばれるか、を示す。GL_LUMINANCEとかGL_RGBとかが入る。
format
GL_RGBとかGL_LUMINANCEとかが入る。(GL_INTENSITYは入れちゃダメ。)
type
データの区切りはなにか?GL_FLOATとかGL_UNSIGNED_BYTEとかが入る。

internal format

最後の引数によって与えられた"テクスチャデータのポインタ"が、typeformat引数によって解釈され、
(RGBA,デプス、輝度、強度)成分の対応付けが行われる。
その後、どの成分を実際に使うのかを指定するのがinternal format
ここで何を指定したかはgltexenvシェーダでテクスチャを扱う時に関わる。
internal format 導出されるソースカラー(R,G,B,A)
GL_ALPHA (0,0,0,A)
GL_LUMINANCE (L,L,L,1)
GL_LUMINANCE_ALPHA (L,L,L,A)
GL_INTENSITY (I,I,I,I)
GL_RGB (R,G,B,1)
GL_RGBA (R,G,B,A)

もっと細かい指定

成分に関して特定の解像度を要求できる。

format

もし、typeでGL_UNSIGNED_BYTEを指定して、formatでGL_RGBAを指定したら、全部で4バイトになる。
typeでGL_UNSIGNED_INTやGL_INTを指定して、formatでGL_RGBAを指定したら、全部で16バイトになる。
じゃあ、GL_LUMINANCEでGL_INTなら全部で4バイトってこと?
GL_COLOR_INDEX
GL_DEPTH_COMPONENT
GL_RGB
GL_RGBA
GL_RED
GL_GREEN
GL_BLUE
GL_ALPHA
GL_LUMINANCE
GL_LUMINANCE_ALPHA

type

GL_BYTE
GL_UNSIGNED_BYTE
GL_SHORT
GL_UNSIGNED_SHORT
GL_INT
GL_UNSIGNED_INT
GL_FLOAT
GL_BITMAP

dataポインター

C++なら配列のポインタ。
AndroidだったらBuffer
あるいは、GLUtilsにBitmapをそのままデータとして渡せる関数texImage2Dがある。

 ByteBuffer bb = ByteBuffer.allocateDirect(配列データ.length).order(ByteOrder.nativeOrder()); 
bb.put(配列データ).position(0);
GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, 512, 512, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE,bb );

glteximage2d

サポートサイト Wikidot.com glteximage2d