【发布时间】:2011-12-27 21:32:07
【问题描述】:
那么,在进行光照计算之前将所有内容转换为眼睛空间会有所帮助吗?我在转换部分遇到问题。我已经正确地转换了法线,但是当我应用平移时(当对象不在世界坐标系的中心时),光照保持完全相同。
我已确认任何 C++ 代码都没有问题。 我将粘贴我的着色器...
问题:我想知道我没有正确转换的地方,以及我应该如何转换它。
顶点着色器...
const int MAXLIGHTS = 4;
uniform int lightcount;
uniform vec4 lPositions[MAXLIGHTS];
//V = transformed vertex
//N = transformed normal
//E = eye vector
//L = vector from vertex to light
varying vec3 V, N, E, L[MAXLIGHTS];
void main()
{
int lcount = lightcount > MAXLIGHTS ? MAXLIGHTS : lightcount;
V = vec3(gl_ModelViewMatrix * gl_Vertex);
N = gl_NormalMatrix * gl_Normal;
E = normalize(-V);
for(int i = 0; i < lcount; i++)
{
L[i] = gl_NormalMatrix * normalize(vec3(lPositions[i] - gl_Vertex));
}
gl_FrontColor = gl_Color;
gl_Position = ftransform();
}
片段着色器...
const int MAXLIGHTS = 4;
uniform int lightcount;
uniform vec4 lDiffuses[MAXLIGHTS];
uniform vec4 lAmbients[MAXLIGHTS];
varying vec3 V, N, E, L[MAXLIGHTS];
uniform bool justcolor;
void main()
{
if(justcolor)
{
gl_FragColor = gl_Color;
return;
}
int lcount = lightcount > MAXLIGHTS ? MAXLIGHTS : lightcount;
vec4 ambient;
vec4 diffuse;
vec4 specular = vec4(0.0, 0.0, 0.0, 0.0);
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
vec3 H;
float NL;
float NH;
for(int i = 0; i < lcount; i++)
{
specular = vec4(0.0, 0.0, 0.0, 0.0);
ambient = lAmbients[i];
NL = dot(N, L[i]);
diffuse = lDiffuses[i] * max(NL, 0.0);
if(NL > 0.0)
{
H = normalize(E + L[i]);
NH = max(0.0, dot(N, H));
specular = pow(NH, 40.0) * vec4(0.3, 0.3, 0.3, 1.0);
}
color += gl_Color * (diffuse + ambient) + specular;
}
gl_FragColor = color;
}
【问题讨论】:
-
我应该做哪些我没有做的事情来将我的变量转换到眼睛空间?