Opengl照明工作在顶部,底部,正面,背面,但不在模型的两侧

时间:2017-06-21 12:39:19

标签: matlab opengl lighting tao-framework shading

我有一个由五个立方体组成的模型,整个模型都有纹理,我添加了照明,它有点适用于立方体的顶部,底部,字体和背面,但不是侧面,还有一个问题阴影,因为有光应该是阴影。 我正在使用基于Tao框架的Matlab .NET opengl包装器,这是一个不寻常的我承认。

如果被问到,我可以提供整个代码,但现在,这是我的照明代码

%% Lighting 

% Enable Light
Gl.glEnable(Gl.GL_LIGHTING);
% Vector for light position (directional light - try a positional one)

% Get Projection matrix in array of length 16
projmatrix = NET.createArray('System.Single', 16);
Gl.glGetFloatv(Gl.GL_PROJECTION_MATRIX,projmatrix);
% Reshape to 4x4 matrix
projmatrix=reshape(double(projmatrix),[4 4]);
% Use the inverse projection matrix to get the light fixed with the camera
LightPosCam=(projmatrix)\[0.3 0.5 -0.6 0]';

LightPos= NET.convertArray(LightPosCam, 'System.Single', 4);
Ambient =  NET.convertArray([0.000001 0.000001 0.000001 .1], 
'System.Single', 4); 
Diffuse=  NET.convertArray([0.7 0.7 0.7 1], 'System.Single', 4); 
Specular=  NET.convertArray([0.6 0.6 0.6 1], 'System.Single', 4); 

% Turn on Lighting
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);

Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_POSITION,LightPos);
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_AMBIENT,Ambient);
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_DIFFUSE,Diffuse);
Gl.glLightfv(Gl.GL_LIGHT0,Gl.GL_SPECULAR,Specular);

% Constant attenuation (for distance, etc.)
% Only works for fixed light locations!  Otherwise disabled
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_CONSTANT_ATTENUATION, 1.0);
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_LINEAR_ATTENUATION, 0.0);
Gl.glLightf(Gl.GL_LIGHT0, Gl.GL_QUADRATIC_ATTENUATION, 0.0);
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_LOCAL_VIEWER, Gl.GL_TRUE);

% Normalize vectors
Gl.glEnable(Gl.GL_NORMALIZE);

% Enable ColorMaterial
% Gl.glEnable (Gl.GL_COLOR_MATERIAL ) ;
% Set the Material Properties
floor_ambient = NET.convertArray([0, 0, 0, 0 ], 'System.Single', 4); 
floor_diffuse = NET.convertArray([0.8, 0.8, 0.8, 1.0 ], 'System.Single', 4); 

floor_specular= NET.convertArray([0.7,0.7,0.7, 1 ], 'System.Single', 4);
floor_emission= NET.convertArray([0.2,0.0,0.0, 1 ], 'System.Single', 4);
floor_shininess = 120;
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, floor_ambient);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, floor_diffuse);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, floor_specular);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SHININESS, floor_shininess);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_EMISSION, floor_emission);

% Gourang shanding
Gl.glShadeModel(Gl.GL_SMOOTH);

% Specular color enable

Gl.glLightModeli(Gl.GL_LIGHT_MODEL_COLOR_CONTROL,
Gl.GL_SEPARATE_SPECULAR_COLOR);
%  Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, 
Gl.GL_MODULATE);
% Gl.glEnable(Gl.GL_BLEND); 

这是我的代码只有一个立方体

     %% Draw Sats
        % Select our texture

        Gl.glEnable(Gl.GL_NORMALIZE)

        %     Bottom Face  
        Gl.glEnable(Gl.GL_TEXTURE_2D);
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID8);  %%Metalic Texture
        Gl.glBegin(Gl.GL_QUADS);
            Gl.glNormal3f(0,0,-1);
            Gl.glTexCoord2f(0,0);
            Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1));  
            Gl.glNormal3f(0,0,-1);
            Gl.glTexCoord2f(1,0);
            Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2));   
            Gl.glNormal3f(0,0,-1);
            Gl.glTexCoord2f(1,1);
            Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4));   
            Gl.glNormal3f(0,0,-1);
            Gl.glTexCoord2f(0,1);
            Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3));   

        %     Top Face
           Gl.glEnd()

        Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID3);  %%Glyph1 Texture
        Gl.glBegin(Gl.GL_QUADS);
            Gl.glNormal3f(0,0,1);
            Gl.glTexCoord2f(0,0);
            Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7));               

        Gl.glNormal3f(0,0,1);
        Gl.glTexCoord2f(1,0);
        Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8));               

        Gl.glNormal3f(0,0,1);
         Gl.glTexCoord2f(1,1);
         Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));              

        Gl.glNormal3f(0,0,1);
        Gl.glTexCoord2f(0,1);
        Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5));
        Gl.glEnd()

        % Front Face
        Gl.glBindTexture(Gl.GL_TEXTURE_2D, data.TextureID);  
        Gl.glEnable(Gl.GL_TEXTURE_2D);  
        Gl.glBegin(Gl.GL_QUADS);
        Gl.glNormal3f(0,-1,0);
        Gl.glTexCoord2f(0,0);
        Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1));               

         Gl.glNormal3f(0,-1,0);
         Gl.glTexCoord2f(1,0);
         Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5));              

        Gl.glNormal3f(0,-1,0);
        Gl.glTexCoord2f(1,1);
        Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));               

        Gl.glNormal3f(0,-1,0);
        Gl.glTexCoord2f(0,1);   
        Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2));

        %     Back Face

        Gl.glNormal3f(0,1,0);
        Gl.glTexCoord2f(0,0);
        Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3));               

        Gl.glNormal3f(0,1,0);
        Gl.glTexCoord2f(1,0);
        Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4));               

        Gl.glNormal3f(0,1,0);
        Gl.glTexCoord2f(1,1);
        Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8));               

        Gl.glNormal3f(0,1,0);
        Gl.glTexCoord2f(0,1);
        Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7));

        %     Right Face

         Gl.glNormal3f(-1,0,0);
         Gl.glTexCoord2f(0,0);
         Gl.glVertex3f(cornersx(4), cornersy(4), cornersz(4));              

         Gl.glNormal3f(-1,0,0);
         Gl.glTexCoord2f(1,0);
         Gl.glVertex3f(cornersx(2), cornersy(2), cornersz(2));              

         Gl.glNormal3f(-1,0,0);
         Gl.glTexCoord2f(1,1);
         Gl.glVertex3f(cornersx(6), cornersy(6), cornersz(6));              

        Gl.glNormal3f(-1,0,0);
        Gl.glTexCoord2f(0,1);
        Gl.glVertex3f(cornersx(8), cornersy(8), cornersz(8));

        %     Left Face

         Gl.glNormal3f(1,0,0);
         Gl.glTexCoord2f(0,0);
         Gl.glVertex3f(cornersx(3), cornersy(3), cornersz(3));              
         Gl.glNormal3f(1,0,0);
         Gl.glTexCoord2f(1,0);
         Gl.glVertex3f(cornersx(1), cornersy(1), cornersz(1));                  
         Gl.glNormal3f(1,0,0);
         Gl.glTexCoord2f(1,1);
         Gl.glVertex3f(cornersx(5), cornersy(5), cornersz(5));                  
         Gl.glNormal3f(1,0,0);
         Gl.glTexCoord2f(0,1);
         Gl.glVertex3f(cornersx(7), cornersy(7), cornersz(7));
        Gl.glEnd()

Finally a gif of my model and the issue in action.

1 个答案:

答案 0 :(得分:0)

我可以看到两个潜在的问题:

  1. 如果你只是右脸和左脸都有问题,可能只是你不小心翻了表面法线。我会试试这个:

    Gl.glNormal3f(1,0,0);   % For all of the right face vertices
    Gl.glNormal3f(-1,0,0);  % For all of the left face vertices
    

    当曲面法线指向错误的方向时(即进入您的立方体),这意味着多边形的背面朝外。当您致电Gl.glMaterialfv时,您指定Gl.GL_FRONT而非Gl.GL_FRONT_AND_BACK,这意味着背面不会被点亮。我猜这就是为什么你看不到侧面没有照明。

  2. 我不知道你的顶点的顺序是否重要,这样当从立方体的外面看时,它们应始终以顺时针或逆时针顺序指定在脸部周围。由于我不知道您的cornersxcornersycornersz数据是什么样的,我无法判断您是将它们定义为顺时针还是逆时针。 然而,我可以告诉你,你的一个面被定义为顺时针顺序不同于其余面:面,顶点排序为3 -> 1 -> 5 -> 7。我对你的灯光框架知之甚少,不知道这是否有问题,但为了保持一致性,你可能想要按照1 -> 3 -> 7 -> 5的顺序定义左脸的顶点。

    < / LI>