球体を照らすには、フラグメント シェーダーでスポットライトを作成する必要があります。現在、頂点シェーダーにポイント ライトがあり、それをかむ方法がまったくわかりません。
#version 140
in vec4 vPosition;
in vec4 vNormal;
out vec4 color;
// implicit definition: out vec4 gl_Position;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
uniform vec4 lPosition;
uniform vec4 lAmbient;
uniform vec4 lDiffuse;
uniform vec4 lSpecular;
uniform float Shininess;
uniform vec4 matColor;
void main()
{
vec4 ambient, diffuse, specular;
vec3 N,L,E,H;
gl_Position = projection * view * model * vPosition;
ambient = matColor*lAmbient;
N = normalize((view*model*vNormal).xyz);
L = normalize((view*model*lPosition).xyz - (view*model*vPosition).xyz);
diffuse = max(dot(L,N), 0.0)*(matColor*lDiffuse);
E = -normalize((view * model * vPosition).xyz);
H = normalize(L + E);
specular = max(pow(max(dot(N, H), 0.0), Shininess)
*lSpecular, 0.0);
color = vec4((ambient+diffuse+specular).rgb, 1.0);
}
私がスポットライトを読んだ限り、ポイントライトとは異なり、一定の線形および二次減衰+カットオフパラメーターを含む減衰がありますか?
私が行った限り:
spottlightEffect の計算:
spottEffect = pow(max(dot(spotdirection, gl_Position), 0.0), spotexponent);
減衰の計算:
att = (1 / (const_attenuation + linear_attenuation * (view*model*lPosition) + quadratic_attenuation * (view*model*lPosition) * (view*model*lPosition))).xyz;
記事を正しく理解しているので、正しいはずですが、次に何をすべきかわかりません...カットオフのifステートメントを追加しますか?