OpenGL照明不着色

时间:2015-04-13 23:31:08

标签: c++ opengl

我正在尝试为我的场景添加基本光照。到目前为止,即使没有GLSL。看来我的灯光不起作用。我的意思是一切都没有阴影(一切都亮了)。

enter image description here

我知道图片并不是最好的,但这部分是因为纹理在图像中有阴影。

这是我的初始代码:

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);                            // Clear to black with full alpha
   glEnable(GL_DEPTH_TEST);                                         // Enable depth testing
   glDepthFunc(GL_LEQUAL);                                          // Specify depth testing function
   glClearDepth(1.0);                                               // Clear the full extent of the depth buffer (default)
   glEnable(GL_CULL_FACE);                                          // Enable face culling
   glCullFace(GL_BACK);                                             // Cull back faces of polygons
   glFrontFace(GL_CCW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
    glEnable ( GL_COLOR_MATERIAL );

    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 0.2f };
    GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
    GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
    GLfloat position[] = {0, 100.0f, 0, 1.0f };

    glLightModelfv(GL_AMBIENT, ambientLight);
    glLightModelfv(GL_DIFFUSE, ambientLight);
    glLightModelfv(GL_SPECULAR, specularLight);
    glLightModelfv(GL_POSITION, position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
    glLightfv(GL_LIGHT0, GL_POSITION, position);

绘制代码:

 glEnable(GL_COLOR_MATERIAL);
 glEnable(GL_LIGHTING);
 glEnable(GL_NORMALIZE);

 //For loop of the lights...
      glLightfv(GL_LIGHT0+m_lights.at(i)->id, GL_POSITION, glm_to_array(m_lights.at(i)->position));
        glEnable(GL_LIGHT0+m_lights.at(i)->id);

 //Draw geometry here...

是的,我正在从网格文件中检索法线并插入每个面的glNormal3f。 (GL_TRIANGLES)即使我完全将法线改为随机值,即使模型所在的平面也不会受到影响。

平面示例:

 if(m_shader_programme){
        glUseProgram(m_shader_programme);
    }

    if(m_texture_id){
        glBindTexture(GL_TEXTURE_2D, m_texture_id);
        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    }


    glBegin(GL_TRIANGLES);

        glNormal3f(0.0f, 1.0f, 0.0f);
        glTexCoord2f(0.0f, m_sizey/10);
        glVertex3f(m_sizex, m_height, m_sizey);

        glTexCoord2f(m_sizex/10, m_sizey/10);
        glVertex3f(m_sizex, m_height, -m_sizey);

        glTexCoord2f(m_sizex/10, 0.0f);
        glVertex3f(-m_sizex, m_height, -m_sizey);

        glNormal3f(0.0f, 1.0f, 0.0f);

        glTexCoord2f(m_sizex/10, 0.0f);
        glVertex3f(-m_sizex, m_height, -m_sizey);

        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-m_sizex, m_height, m_sizey);

        glTexCoord2f(0.0f, m_sizey/10);
        glVertex3f(m_sizex, m_height, m_sizey);
    glEnd();

    if(m_shader_programme){
        glUseProgram(0);
    }

    if(m_texture_id){
        glBindTexture(GL_TEXTURE_2D, 0);
    }

GLSL片段着色器:

#version 120

uniform sampler2D tex;

void main()
{
    vec4 color = texture2D(tex,gl_TexCoord[0].st);
    gl_FragColor = color;
}

顶点着色器:

#version 120

void main() {

    vec3 normal, lightDir;
    vec4 diffuse, ambient, globalAmbient;
    float NdotL;


    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    normal = normalize(gl_NormalMatrix * gl_Normal);
    lightDir = normalize(vec3(gl_LightSource[0].position));
    NdotL = max(dot(normal, lightDir), 0.0);
    diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
    /* Compute the ambient and globalAmbient terms */

    ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
    globalAmbient = gl_LightModel.ambient * gl_FrontMaterial.ambient;
    gl_FrontColor =  NdotL * diffuse + globalAmbient + ambient;


    gl_Position = ftransform();
}

系统规格

  • OS X(Yosemite)10.10.13(64bit)
  • 渲染器:NVIDIA GeForce GTX 780M
  • 支持OpenGL Engine OpenGL版本2.1 NVIDIA-10.2.7 310.41.25f01

只是包住任何人都在想我为什么不使用OpenGL 3.x是因为GL 3.x在我的机器上看起来不太好。

1 个答案:

答案 0 :(得分:4)

您的片段着色器:

vec4 color = texture2D(tex,gl_TexCoord[0].st);
gl_FragColor = color;

只需丢弃您在顶点着色器中执行的所有计算并对纹理颜色进行采样。您需要将纹理样本乘以插值颜色值:

 vec4 color = texture2D(tex, gl_TexCoord[0].st) * gl_Color;
                                                  ^~~~~~
 gl_FragColor = color;