簡體   English   中英

OpenGL照明不着色

[英]OpenGL Lighting Not Shading

我也嘗試在場景中添加基本照明。 到目前為止,即使沒有GLSL。 看來我的照明不起作用。 我的意思是,一切都沒有陰影(一切都照亮了)。

在此處輸入圖片說明

我知道圖片不是最好的,但這部分是因為圖像中的紋理被陰影化了。

這是我的初始化代碼:

    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引擎OpenGL版本受支持2.1 NVIDIA-10.2.7 310.41.25f01

只是讓所有人都納悶,為什么我不使用OpenGL 3.x是因為GL 3.x在我的機器上似乎玩的不好。

您的片段着色器:

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

只需丟棄您在頂點着色器中所做的所有計算並采樣紋理顏色即可。 您需要將紋理樣本乘以插值的顏色值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM