テクスチャ

texture.png
テクスチャには2種類ある
プロシージャルテクスチャ パターンは数式やアルゴリズムで決まる
イメージベーステクスチャ 写真、手描きの絵、等画像を使用するテクスチャ

テクスチャを使う手順

  1. glGenTextures….テクスチャ名(ID)を作成する
  2. glBindTexture…
  3. glTexImage2D….テクスチャデータを渡す
  4. glTexParameter….フィルタリングの設定
  5. glTexEnv
  6. glTexCoord or glMultiTexCoord(…glTexCoordPointerにより指定された配列により。glTexGenでも作れる)
    1. glClientActiveTexture
    2. glTexCoordPointer

init関数にて

glGenTextures ( 1, &texId );
   glBindTexture ( GL_TEXTURE_2D, texId );
 
   glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, GAUSSIZE, GAUSSIZE, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texturedatapointer);
   glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
   glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
   glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
   glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
   gTexSamplerLoc= glGetUniformLocation ( gProgram, "tex0" );//shader用

glTexImage*D

display関数にて

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texId[quad]);
glBegin(GL_QUADS);
//テクスチャ座標、頂点座標、の順がうまくいく
glTexCoord2i(0,1);
glVertex3f(0,0,0);
glEnd();

複数のテクスチャを使う際に間違えやすいこと

glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1);
...

は、同じオブジェクトに複数のテクスチャを重ねて貼りたい場合に使うもの。
違うオブジェクトに違うテクスチャを貼りたい場合は
glEnable(GL_TEXTURE2D);
glBindTexture(GL_TEXTURE2D,texid1);
//オブジェクト1
glBindTexture(GL_TEXTURE2D,texid2);
//違う模様にしたいオブジェクト2

という風にglBindTextureで切り替える

遭遇したエラー

glGenTexturesでINVALIS_OPERATION

glutInitするまえにglGenTexturesすると、エラーコード0x502 無効な操作(INVALIS_OPERATION)になるよ。

GLES20.glEnable(GLES20.GL_TEXTURE_2D);でGL_INVALID_ENUM

OpenGL ESの仕様書によると、glEnable()で渡しても良い引数は以下の9つだけ。
その中にGL_TEXTURE_2Dは入っていない。
glEnableしても良いもの 説明
GL_BLEND If enabled, blend the computed fragment color values with the values in the color buffers. See glBlendFunc.
GL_CULL_FACE If enabled, cull polygons based on their winding in window coordinates. See glCullFace.
GL_DEPTH_TEST If enabled, do depth comparisons and update the depth buffer. Note that even if the depth buffer exists and the depth mask is non-zero, the depth buffer is not updated if the depth test is disabled. See glDepthFunc and glDepthRangef.
GL_DITHER If enabled, dither color components or indices before they are written to the color buffer.
GL_POLYGON_OFFSET_FILL If enabled, an offset is added to depth values of a polygon's fragments produced by rasterization. See glPolygonOffset.
GL_SAMPLE_ALPHA_TO_COVERAGE If enabled, compute a temporary coverage value where each bit is determined by the alpha value at the corresponding sample location. The temporary coverage value is then ANDed with the fragment coverage value.
GL_SAMPLE_COVERAGE If enabled, the fragment's coverage is ANDed with the temporary coverage value. If GL_SAMPLE_COVERAGE_INVERT is set to GL_TRUE, invert the coverage value. See glSampleCoverage.
GL_SCISSOR_TEST If enabled, discard fragments that are outside the scissor rectangle. See glScissor.
GL_STENCIL_TEST If enabled, do stencil testing and update the stencil buffer. See glStencilFunc and glStencilOp.

テクスチャが真っ黒になる

テクスチャの設定を変えると見えるかもよ

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);

上のコードの意味の詳細はテクスチャに関する設定をするのページ参照

テクスチャ素材リンク集

Bibliography

サポートサイト Wikidot.com