因此,它有助于在进行照明计算之前将所有东西都转换为眼睛空间?我在转换部分遇到问题。我已经正确地转换了法线,但是当我应用翻译时(当对象不在世界坐标系的中心时),照明保持完全相同。GLSL/GL2.1照明:转换到眼睛空间
我已确认任何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;
}
你的问题是什么? –
我该怎么做,我没有把我的变量转换成眼睛空间? – Miles