我需要一個簡單聚光燈着色器的幫助。 錐體內的所有頂點都應爲黃色,錐體外的所有頂點應爲黑色。 我只是不能得到它的工作。我認爲它與從世界到眼座標的轉變有關。簡單GLSL聚光燈着色器
頂點着色器:
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))
新問題:
的光似乎並沒有留在現場的固定位置,而似乎是相對於移動當我向前或向後移動時,作爲錐體的相機變得更小或更大。
哪裏是你的'#version'指令? – genpfault
而不是設置gl_FrontColor我只是將一個顏色值作爲變量傳遞給片段着色器。再次,當我寫GLSL 1.20時,通常只是爲了向後兼容GLSL 3.30+着色器,並且我以同樣的方式做事。我仍然認爲它與gl_FrontColor有關,但看看這個問題:http://stackoverflow.com/questions/6430154/what-is-the-relationship-between-gl-color-and-gl-frontcolor-in-both -vertex-and -f –