2015-12-12 3 views
-2

Мой код работает правильно. Я вижу землю на экране вывода. Но я хочу осветить землю, чтобы показаться 3-й. Поэтому я добавил код и функцию в свой код. Но вывод не изменился. Что я могу сделать, чтобы осветить землю? Спасибо за ответы ... Мой код ниже.Освещение openGL в C++

#define _USE_MATH_DEFINES 
#include <cmath> 
#include <stdlib.h> 
#include <math.h> 
#include <GL/glut.h> 
float distance = 5.0; 
int longitude = 0, latitude = 0, ainc = 5; 
int lastx = -1, lasty = -1; 
int data[17][21] = 
{ { 14 ,25, 45 ,55 ,68 ,70 ,84 ,91 ,97, 101 ,105 ,105 ,105, 105 ,110 ,110, 110, 110 ,110, 110, 110 }, 
{ 5, 18, 43, 62 ,73, 82, 88, 94, 99, 102 ,105, 105 ,105, 105, 110, 110 ,110 ,110 ,110, 110, 110 }, 
{ 5, 18 ,38 ,56, 69, 77, 86, 94, 99, 103, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 }, 
{ 5 ,9 ,31, 48, 60, 71, 81, 87, 95, 101, 106, 105, 105, 105, 110, 110, 110, 110, 110, 110, 110 }, 
{ 5, 5, 18, 37, 49, 56, 62, 81, 91, 94, 101, 105, 105, 105, 110, 110, 110 ,110 ,110, 110, 110 }, 
{ 5, 5, 12, 23 ,34, 40, 53 ,66 ,77 ,82, 97, 103, 105, 105, 109, 110, 110, 110, 110, 115, 115 }, 
{ 4 ,5 ,8 ,15, 20, 24, 35, 39, 40, 77, 92, 101, 104, 104 ,105, 110, 110, 110, 115, 115, 115 }, 
{ 5, 7 ,22, 36, 46, 48, 48, 44 ,50, 58, 80, 96, 96, 97, 106, 110, 110, 115, 115, 115, 115 }, 
{ 4, 15 ,31 ,46 ,61, 68, 69, 63, 53, 50, 67, 82, 84, 103, 108, 110, 110, 115, 115, 115, 115 }, 
{ 4, 12, 31, 46, 64, 78, 82, 80, 69, 54, 73, 71, 92, 105, 108, 110, 110, 115, 115, 115, 115 }, 
{ 6, 26 ,35 ,45, 63, 75, 84, 87, 84, 74 ,77, 80, 96, 103, 108, 110, 110, 110, 115, 115, 115 }, 
{ 21, 30, 46, 57 ,64 ,76 ,85 ,92 ,92, 87 ,79 ,80 ,86 ,102, 106, 110, 105 ,110, 115, 115, 115 }, 
{ 27, 40, 48 ,62 ,75 ,84 ,92, 96, 97 ,94 ,88 ,80 ,80 ,91, 104, 105, 105, 105, 110, 115, 115 }, 
{ 33, 43, 55, 65, 75, 87, 96, 101, 101, 101, 97, 92, 80, 80, 98, 105, 105, 105, 105, 110, 115 }, 
{ 45, 50, 58, 68, 80, 91, 99, 102, 105, 105, 105, 99, 90, 80, 80, 97, 105, 105, 105, 110, 100 }, 
{ 50, 60, 65, 71, 84, 95, 101, 105, 105, 107, 107, 106, 102, 101, 92, 80, 98, 104, 105, 100, 100 }, 
{ 60, 70, 76, 83, 88 ,96, 103, 106 ,107, 108 ,110, 109 ,108 ,108, 106, 101 ,90, 100, 100, 100, 100 } }; 
//bool tamam=true; 

void display(void) { 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
int type = GL_TRIANGLES; // or GL_LINE_LOOP 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

GLfloat qaBlack[] = { 0,0,0,1 }; 
GLfloat qaGreen[] = { 0,1,0,1 }; 
GLfloat qaWhite[] = { 1,1,1,1 }; 
glMaterialfv(GL_FRONT, GL_AMBIENT, qaGreen); 
glMaterialfv(GL_FRONT, GL_DIFFUSE, qaGreen); 
glMaterialfv(GL_FRONT, GL_SPECULAR, qaWhite); 
glMaterialf(GL_FRONT, GL_SHININESS, 10000); 



gluLookAt(350, 600, 400, 280, 300, 300, 1, 1, 1.0); 
int x = 0; 
int z = 0; 
int y = 0; 

//glColor3f(1.0, 1.0, 1.0); 
glBegin(type); 
for (int i = 0; i < 16; i++) 
{ 
    x = 0; 

    for (int k = 0; k < 20; k++) 
    { 
     y = data[i][k]; 
     if (y >= 80) 
      glColor3f(1.0, 0.0, 0.0); 
     if (y>0 && y<50) 
      glColor3f(0.0, 1.0, 0.0); 
     if (y >= 50 && y<80) 
      glColor3f(1.0, 1.0, 0.0); 



     glVertex3f(x, data[i][k], z); 
     glVertex3f(x, data[i + 1][k], z + 20); 
     glVertex3f(x + 20, data[i + 1][k + 1], z + 20); 


     x = x + 20; 

    } 


    z = z + 20; 

} 
glEnd(); 
z = 0; 
glBegin(type); 
for (int i = 0; i < 16; i++) 
{ 

    x = 0; 


    for (int k = 0; k < 20; k++) 
    { 
     y = data[i][k]; 
     if (y>0 && y<50) 
      glColor3f(0.0, 1.0, 0.0); 
     if (y >= 50 && y<80) 
      glColor3f(1.0, 1.0, 0.0); 
     if (y >= 80) 
      glColor3f(1.0, 0.0, 0.0); 


     glVertex3f(x + 20, data[i + 1][k + 1], z + 20);//z*i 
     glVertex3f(x + 20, data[i][k + 1], z); 
     glVertex3f(x, data[i][k], z); 



     x = x + 20; 

    } 


    z = z + 20; 

} 


glEnd(); // front 

      /*if(tamam)*/ 

      /*tamam=false;*/ 
      //glFlush(); 

glutSwapBuffers(); 
} 
void Initialize() { 
glClearColor(10,10,10,10); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 


glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

GLfloat qaAmbient[] = { 20,20,20,10 }; 
GLfloat qaDiffuseLight[] = { 80,80,80,10 }; 
GLfloat qaSpecularLight[] = { 10,10,10,10 }; 
glLightfv(GL_LIGHT0, GL_AMBIENT, qaAmbient); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight); 
glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight); 

GLfloat qaLightPosition[] = { 0.5,0.5,0,1 }; 
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition); 
} 
void keyboard(unsigned char key, int x, int y) 
{ 
switch (key) { 
case 27: case 'q': case 'Q': 
    exit(EXIT_SUCCESS); 
    break; 
} 
} 







int main(int argc, char *argv[]) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(1200, 720); 
glutCreateWindow(argv[0]); 
//init(); 
//glViewport(0, 0,glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT)); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(300, glutGet(GLUT_WINDOW_WIDTH)/  
glutGet(GLUT_WINDOW_HEIGHT), 2, 900.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glutDisplayFunc(display); 
glutKeyboardFunc(keyboard); 
glEnable(GL_DEPTH_TEST); 
glutMainLoop(); 
return EXIT_SUCCESS; 
} 

ответ

0

При работе с OpenGL вам необходимо создать собственное определение Light и задействовать 3 различных типа огней. Также при работе с освещением в любых 3D-графических приложениях; вершины, ребра и поверхности должны иметь нормальные значения, чтобы вычисления света вернули нас правильно. Однако, если вы планируете использовать OpenGL, было бы целесообразно использовать Modern OpenGL по крайней мере версии 3.3 или выше с использованием языка шейдеров OpenGL GLSL!