【发布时间】:2015-06-19 14:25:21
【问题描述】:
我需要一个简单的聚光灯着色器方面的帮助。 圆锥内的所有顶点都应该涂成黄色,圆锥外的所有顶点都应该涂成黑色。 我只是无法让它工作。我认为这与从世界到眼睛坐标的转换有关。
顶点着色器:
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指令在哪里? -
我不会设置 gl_FrontColor,而是将颜色值作为
varying传递给片段着色器。再说一次,当我针对 GLSL 1.20 编写代码时,通常只是为了向后兼容 GLSL 3.30+ 着色器,我以同样的方式做事。我仍然认为它与 gl_FrontColor 相关,请看另一个问题:stackoverflow.com/questions/6430154/…
标签: opengl graphics glsl shader