この質問がすでに多く寄せられていることは知っていますが、まだ正しく答えることができません。
そのため、頂点シェーダーでは、ライトの位置と目の位置を取得する必要があります。これが私のコードです:
void main(void)
{
vec3 p = vec3 ( gl_ModelViewMatrix * gl_Vertex );
l = normalize (vec3 (gl_LightSource[0].position));
v = normalize ( vec3 ( eyePos ) - p );
n = normalize ( gl_NormalMatrix * gl_Normal );
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
その結果、カメラの動きに合わせて光が移動します。ここで正確に何をする必要がありますか?おそらく非openglマトリックスを使用しません。
適切なカメラ制御を備えた glsl 照明の例はありますか?
* アップデート *
Kos のおかげで、「ライトがカメラとともに移動する」問題を解決できましたが、別の問題があります。
私は持っている
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
ctLight -> enable();
glPushMatrix();
glTranslatef(0, 0, 0);
glRotatef(angle, 0, 1, 0);
glutSolidTeapot(2.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0, 0, 8);
glRotatef(angle, 0, 1, 0);
glutSolidTeapot(2.0);
glPopMatrix();
ctLight -> disable();
glDisable(GL_LIGHT0);
これで、2 番目のティーポットが (0, 0, 0) のティーポットと同じように点灯します。これを修正するにはどうすればよいですか?
次の場合の頂点シェーダー コード:
void main(void)
{
vec3 p = vec3 ( gl_ModelViewMatrix * gl_Vertex ); // transformed point to world space
l = normalize ( vec3 (gl_LightSource[0].position) );
v = normalize ( - p );
h = normalize ( l + v );
n = normalize ( gl_NormalMatrix * gl_Normal ); // transformed n
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}