Моя ошибка заключалась в непереопределении векторов нормали. Как выяснилось, это критично). Ниже привожу рабочий код.
#include <windows.h> // Çàãîëîâî÷íûé ôàéë äëÿ Windows #include <gl\gl.h> // Çàãîëîâî÷íûé ôàéë äëÿ OpenGL32 áèáëèîòåêè #include <gl\glu.h> // Çàãîëîâî÷íûé ôàéë äëÿ GLu32 áèáëèîòåêè #include <gl\glaux.h> // Çàãîëîâî÷íûé ôàéë äëÿ GLaux áèáëèîòåêè #include <GL\glut.h> static HGLRC hRC; // Ïîñòîÿííûé êîíòåêñò ðåíäåðèíãà static HDC hDC; // Ïðèâàòíûé êîíòåêñò óñòðîéñòâà GDI BOOL keys[256]; // Ìàññèâ äëÿ ïðîöåäóðû îáðàáîòêè êëàâèàòóðû GLfloat light_ambient[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_position[] = { 9.0, 6.0, 0.0, 0.0 }; GLfloat xrot; // Âðàùåíèå X GLfloat yrot; // Y GLfloat zrot; // Z GLfloat nx,ny,nz; GLuint texture[1]; // Ìåñòî äëÿ îäíîé òåêñòóðû // Çàãðóçêà êàðòèíêè è êîíâåðòèðîâàíèå â òåêñòóðó GLvoid LoadGLTextures(){ // Çàãðóçêà êàðòèíêè AUX_RGBImageRec *texture1; texture1 = auxDIBImageLoad("space.bmp"); // Ñîçäàíèå òåêñòóðû glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data); } GLvoid InitGL(GLsizei Width, GLsizei Height){ LoadGLTextures(); // Çàãðóçêà òåêñòóð glEnable(GL_TEXTURE_2D); // Ðàçðåøåíèå íàëîæåíèå òåêñòóðû glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(450.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //LIGHT// glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular); glLightfv (GL_LIGHT0, GL_POSITION, light_position); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); } GLvoid DrawGLScene(GLvoid){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); glPushMatrix(); glTranslatef(2.6f,0.0f,0.0f); glRotatef(70,1.0f,0.0f,0.0f); glutSolidSphere(1,10,10); glPopMatrix(); glRotatef(xrot,1.0f,0.0f,0.0f); // Âðàùåíèå ïî îñè X glRotatef(yrot,0.0f,1.0f,0.0f); // Âðàùåíèå ïî îñè Y glRotatef(zrot,0.0f,0.0f,1.0f); // Âðàùåíèå ïî îñè Z glPushMatrix(); glLoadIdentity(); glLightfv (GL_LIGHT0, GL_POSITION, light_position); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); // Ïåðåäíÿÿ ãðàíü glNormal3f(0,0,1); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ëåâî 1 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ïðàâî 2 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Âåðõ ïðàâî 3 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Âåðõ ëåâî // Çàäíÿÿ ãðàíü glNormal3f(0,0,-1); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Íèç ïðàâî glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ëåâî glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Íèç ëåâî // Âåðõíÿÿ ãðàíü glNormal3f(0,1,0); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ëåâî glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Íèç ëåâî glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Íèç ïðàâî glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî // Íèæíÿÿ ãðàíü glNormal3f(0,-1,0); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Âåðõ ïðàâî glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Âåðõ ëåâî glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ëåâî glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ïðàâî // Ïðàâàÿ ãðàíü glNormal3f(1,0,0); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Íèç ïðàâî glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Âåðõ ïðàâî glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Âåðõ ëåâî glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Íèç ëåâî // Ëåâàÿ ãðàíü glNormal3f(-1,0,0); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Íèç ëåâî glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Íèç ïðàâî glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Âåðõ ïðàâî glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Âåðõ ëåâî glEnd(); /* glBegin(GL_QUADS); glNormal3f(0.0, 0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glEnd(); glBegin(GL_QUADS); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd(); glBegin(GL_QUADS); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glEnd(); glBegin(GL_QUADS); glNormal3f(1.0, 0.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glEnd(); glBegin(GL_QUADS); glNormal3f(0.0, 0.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd(); */ glLoadIdentity(); glLightfv (GL_LIGHT0, GL_POSITION, light_position); ///// <------ glutSwapBuffers(); glutPostRedisplay(); xrot+=0.1f; // Îñü âðàùåíèÿ X yrot+=0.1f; // Îñü âðàùåíèÿ Y zrot+=0.1f; // Îñü âðàùåíèÿ Z } int main (int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize (500, 500); glutCreateWindow ("ßùèê"); InitGL (30,30); glutDisplayFunc (DrawGLScene); glutMainLoop(); return 0; return 0; }