OpenGL Shading Language

すごい初歩的な所で躓いてしまっている感じ。

www.gpgpu.orgのHelloGPGPUのsampleの中の、

// identify the bound texture unit as input to the filter
glUniform1iARB(_texUnit, 0);

Fragment Shaderのuniform sampler2D texUnit にtextureの番号を設定しているところなんだけれど、この 0 っていう数字は何で決定されるのかが疑問だった。

http://66.102.7.104/search?q=cache:jF50aBt4V0AJ:www.cgshaders.org/forums/viewtopic.php%3Ft%3D2745%26sid%3D08bffc31f23347ccd7ac8415942c86fd+glUniform1iARB+texture&hl=ja&inlang=ja

を見てみると、texture idではなく、使われているtexture unitを指定する、というような事が書かれている。う〜ん、それだとtextureを用意した順番に合わせなければいけないんだろうか?謎。HelloGPGPUのsampleを改造して0以外の数字を使うように変更出来ない。。orz

マルチテクスチャにして、glActiveTextureで複数有効にして、glMultiTexCoord2fとかで複数設定して始めて、fragment shaderの中で、0番以外のも使えるようになるのかな?

しかし、glActiveTextureに渡す引数の数字は、http://www.zjprogramming.com/html/multitex.html だとglGenTexturesで求めたidをGL_TEXTURE0に足して求めているんだけれど、それは正しい方法なのだろうか?
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040212 を見ていると、GL_TEXTURE0やGL_TEXTURE1をそのまま使っているけれど。う〜ん、どちらが正しいのやら。テクスチャーユニットの指定とテクスチャーID?の指定がなんだかごっちゃになってよくわからないや。。

  • glActiveTexture TextureUnit
  • glBindTexture TextureID
  • glTexSubImage2D 事前にbindしたtextureが利用される
  • glUniform1i TextureUnit

なんだろうとは思うけれど…。

http://www.clockworkcoders.com/oglsl/tutorial8.htm
解決!

    • -

gl_TexCoordの型はvec4。
vector4の要素にアクセスする場合

  • 点の座標や法線の場合は {x, y, z, w}
  • 色を表している場合は {r, g, b, a}
  • テクスチャ座標の場合は {s, t, p, q}

というように使い分けすると良いらしい。GPGPUの場合は単に平面に対しての処理だから、xyとかのが判り易いかもしれないので、HelloGPGPUではそうしてるんだろうか?