テクスチャ参照関数

glTexImage*Dで指定したフォーマットとシェーダに来る値の関係

glTexImage2Dを例に説明

glTexImage2D
(GL_TEXTURE_2D,
level,
internal format,
width,height,
border,
format,*data)

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)

OpenGL経由で渡したテクスチャデータは

テクスチャフォーマット 返り値 OpenGL
float型(0.0-1.0) vec4 なんでも
符号なしで正規化された整数(0-1) ivec4
符号なしの整数 uvec4
符号ありの整数 ivec4 GL_BYTE

で保持できる。
?符号なしで正規化された整数が0-1って、0か1しかないマスク画像みたいなかんじかな、
GL_BYTEで渡したものをisamplerで使ってみたら変な値になった。
マイナスのものは出てこず、65535より大きいが214783646よりかは小さい、変なinterger値になった。

uniform sampler3D texture;
...
texture3D(texture,uvw);

という形でやった場合は、
どんな形で渡しても、基本的に0.0-1.0に正規化された状態になっている。

使うことの出来るテクスチャ参照関数

テクスチャ参照関数は頂点シェーダでもフラグメントシェーダでも両方から使うことができる。
どれも第一引数はsamplerである。

texture
textureProj 投影された後のテクスチャを参照する.影のレンダリングに使う
textureLod ある詳細度レベルのテクスチャを参照する
textureGrad テクスチャの微分値を参照する
textureOffset フィルタを適用する際に効果的
texelFetch
texelFetchOffset
textureProjLod
textureProjGrad
textureProjOffset
textureProjLodOffset
textureSize

オプションの第三引数bias

texture(sampler,テクスチャ座標,bias);

と、実は3個目の引数を渡すこともできるのだ。
しかもこのbias引数はフラグメントシェーダでだけ使用可能。頂点シェーダでは使ったらダメなのだ。
biasを使ったらどうなるのか?
テクスチャの参照演算が行われる前に、詳細度レベルの計算に足し算することができる。
bias引数がなかったら、自動的に詳細度レベルを計算する。
Bibliography

サポートサイト Wikidot.com