#ofEnablePointSprites()使うと色々ハマる
ofEnablePointSprite()の中身は
glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE); ← こいつが元凶くさい
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glTexEnvi~にGL_POINT_SPRITEを設定するとポイントスプライト用の特殊なテクスチャ座標ができる。 が、これを呼んでるとvaryingがバグることがある。
##ハマり例
全てのvarying変数をfragの中で一回参照しないと、壊れるvaryingが出てくる
varying vec3 normal;
varying vec4 worldPos;
void main() {
//float angle = normal.z //これコメントアウトしたらworldPosの値がおかしくなる
gl_FragColor = vec4(worldPos);
}
##対策(どっちかやれ)
-
vertexの中でテクスチャユニットの座標を設定する
gl_TexCoord[0] = gl_MultiTexCoord0
-
fragmentの中で使わなくてもテクスチャ座標を一回参照する。
vec2 st = gl_TexCoord[0].st
##結論
-
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)は使わなくて良い人は使わない。
-
テクスチャ座標が欲しい場合はgl_PointCoordでやるのが良い。
-
OpenGL SuperBibleも5th Editionだと glTexEnvi式からgl_PointCoord式へと内容が変更されてる
ポイントスプライトの形自体も中でジェネるから、テクスチャなんかいらねーよっていう性癖の人じゃないと出会わないだろうバグでした