照明在OpenGL中没有显示

时间:2014-03-16 20:47:59

标签: opengl

我正在尝试使用我的教科书示例在OpenGL中进行点源定向照明。我显示了一个以原点为中心的矩形,并在着色器中进行了光照计算。矩形出现,但即使我尝试在其上放置彩色灯,它也是黑色的。矩形的法线全部为(0,1.0,0)。我没有进行任何非均匀缩放,因此常规模型视图矩阵也应该变换法线。

我有代码为着色器设置灯光参数(作为制服)和材质参数(也作为制服)。每个顶点颜色信息都没有。

void InitMaterial()
{
    color material_ambient = color(1.0, 0.0, 1.0);
    color material_diffuse = color(1.0, 0.8, 0.0);
    color material_specular = color(1.0, 0.8, 0.0);
    float material_shininess = 100.0;

    // set uniforms for current program
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialAmbient"), 1, material_ambient);
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialDiffuse"), 1, material_diffuse);
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialSpecular"), 1, material_specular);
    glUniform1f(glGetUniformLocation(Programs[lightingType], "shininess"), material_shininess);
}

对于灯光:

void InitLight()
{
    // need light direction and light position
    point4 light_position = point4(0.0, 0.0, -1.0, 0.0);
    color light_ambient = color(0.2, 0.2, 0.2);
    color light_diffuse = color(1.0, 1.0, 1.0);
    color light_specular = color(1.0, 1.0, 1.0);

    glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightPosition"), 1, light_position);
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightAmbient"), 1, light_ambient);
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightDiffuse"), 1, light_diffuse);
    glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightSpecular"), 1, light_specular);
}

片段着色器是一个简单的直通着色器,它将颜色设置为顶点着色器的一个输入。这是顶点着色器:

#version 150 

in vec4 vPosition;
in vec3 vNormal;
out vec4 color;

uniform vec4 materialAmbient, materialDiffuse, materialSpecular;
uniform vec4 lightAmbient, lightDiffuse, lightSpecular;
uniform float shininess;

uniform mat4 modelView;
uniform vec4 lightPosition;
uniform mat4 projection;

void main() 
{
    // Transform vertex position into eye coordinates
    vec3 pos = (modelView * vPosition).xyz;

    vec3 L = normalize(lightPosition.xyz - pos);
    vec3 E = normalize(-pos);
    vec3 H = normalize(L + E);

    // Transform vertex normal into eye coordinates
    vec3 N = normalize(modelView * vec4(vNormal, 0.0)).xyz;

    // Compute terms in the illumination equation
    vec4 ambient = materialAmbient * lightAmbient;

    float Kd = max(dot(L, N), 0.0);
    vec4 diffuse = Kd * materialDiffuse * lightDiffuse;

    float Ks = pow(max(dot(N, H), 0.0), shininess);
    vec4 specular = Ks * materialSpecular * lightSpecular;

    if(dot(L, N) < 0.0) specular = vec4(0.0, 0.0, 0.0, 1.0);

    gl_Position = projection * modelView * vPosition;

    color = ambient + diffuse + specular;
    color.a = 1.0;
} 

1 个答案:

答案 0 :(得分:0)

好的,它现在正在运作。解决方案是用glUniform4fv替换glUniform3fv,我想是因为glsl对应的是vec4而不是vec3。我认为它能够识别出这一点并简单地在最后添加1.0,但不是。