シンプルなスポットライト シェーダについてサポートが必要です。円錐の内側の頂点はすべて黄色に、円錐の外側の頂点はすべて黒色にします。私はそれを機能させることができません。世界から目の座標への変換と関係があると思います。
頂点シェーダー:
uniform vec4 lightPositionOC; // in object coordinates
uniform vec3 spotDirectionOC; // in object coordinates
uniform float spotCutoff; // in degrees
void main(void)
{
vec3 lightPosition;
vec3 spotDirection;
vec3 lightDirection;
float angle;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// Transforms light position and direction into eye coordinates
lightPosition = (lightPositionOC * gl_ModelViewMatrix).xyz;
spotDirection = normalize(spotDirectionOC * gl_NormalMatrix);
// Calculates the light vector (vector from light position to vertex)
vec4 vertex = gl_ModelViewMatrix * gl_Vertex;
lightDirection = normalize(vertex.xyz - lightPosition.xyz);
// Calculates the angle between the spot light direction vector and the light vector
angle = dot( normalize(spotDirection),
-normalize(lightDirection));
angle = max(angle,0);
// Test whether vertex is located in the cone
if(angle > radians(spotCutoff))
gl_FrontColor = vec4(1,1,0,1); // lit (yellow)
else
gl_FrontColor = vec4(0,0,0,1); // unlit(black)
}
フラグメント シェーダー:
void main(void)
{
gl_FragColor = gl_Color;
}
編集:
ティムは正しいです。これ
if(angle > radians(spotCutoff))
次のようにする必要があります。
if(acos(angle) < radians(spotCutoff))
新しい質問:
ライトはシーン内の固定位置にとどまらないように見えます。代わりに、前方または後方に移動するときにコーンが小さくまたは大きくなるにつれて、カメラに対して相対的に移動するように見えます。