2015-02-01 5 views
0

나는 이미 해결책을 찾았지만 아무 것도 효과가 없었다. 나는 이미 조명을 입혔지만 물체는 모두 꺼져있다.C++ Opengl Lighting doesnt work

예제를 다운로드 할 때 작동하지만 조명을 켜기 위해 시도 할 때 does not work.

#include <GLFW/glfw3.h> 
#include <glm\gtx\transform.hpp> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <GL\glut.h> 

#include "Camera.h" 

#define windowWidth 1024 
#define windowHeight 620 
#define CAMERA_SPEED 0.1 

GLFWwindow* Window; 
CCamera Camera; 

bool aPressed = false; 
bool dPressed = false; 
bool wPressed = false; 
bool sPressed = false; 
bool ePressed = false; 
bool qPressed = false; 
bool spacePressed = false; 

static void keyEvent(GLFWwindow* window_, int key, int scancode, int action, int mods) 
{ 
    if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 
     glfwSetWindowShouldClose(Window, GL_TRUE); 

    if(key == GLFW_KEY_A && action == GLFW_PRESS) 
     aPressed=true; 
    if(key == GLFW_KEY_D && action == GLFW_PRESS) 
     dPressed=true; 
    if(key == GLFW_KEY_W && action == GLFW_PRESS) 
     wPressed=true; 
    if(key == GLFW_KEY_S && action == GLFW_PRESS) 
     sPressed=true; 
    if(key == GLFW_KEY_E && action == GLFW_PRESS) 
     ePressed=true; 
    if(key == GLFW_KEY_Q && action == GLFW_PRESS) 
     qPressed=true; 
    if(key == GLFW_KEY_SPACE && action == GLFW_PRESS) 
     spacePressed=true; 

    if(key == GLFW_KEY_A && action == GLFW_RELEASE) 
     aPressed=false; 
    if(key == GLFW_KEY_D && action == GLFW_RELEASE) 
     dPressed=false; 
    if(key == GLFW_KEY_W && action == GLFW_RELEASE) 
     wPressed=false; 
    if(key == GLFW_KEY_S && action == GLFW_RELEASE) 
     sPressed=false; 
    if(key == GLFW_KEY_E && action == GLFW_RELEASE) 
     ePressed=false; 
    if(key == GLFW_KEY_Q && action == GLFW_RELEASE) 
     qPressed=false; 
    if(key == GLFW_KEY_SPACE && action == GLFW_RELEASE) 
     spacePressed=false; 
} 

int main() 
{ 
    if(!glfwInit()) 
    { 
     exit(EXIT_FAILURE); 
    } 

    Window = glfwCreateWindow(windowWidth, windowHeight, "3D 2.0", NULL, NULL); 

    if(!Window) 
    { 
     glfwTerminate(); 
     exit(EXIT_FAILURE); 
    } 

    glClearColor (0.0, 0.0, 0.0, 0.0); 

    GLfloat light_ambient[] = 
    {0.0, 0.0, 0.0, 1.0}; 
    GLfloat light_diffuse[] = 
    {1.0, 0.0, 0.0, 1.0}; 
    GLfloat light_specular[] = 
    {1.0, 1.0, 1.0, 1.0}; 
/* light_position is NOT default value */ 
    GLfloat light_position[] = 
    {1.0, 1.0, 1.0, 0.0}; 

    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_LIGHT0); 
    glDepthFunc(GL_LESS); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 

    glfwMakeContextCurrent(Window); 
    glfwSwapInterval(1); 

    glfwSetKeyCallback(Window, keyEvent); 

    while(!glfwWindowShouldClose(Window)) 
    { 
     glViewport(0, 0, (double)windowWidth, (double)windowHeight); 

     //glClearColor(0.0,0.5,1.0,1.0); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION_MATRIX); 
     glLoadIdentity(); 


     gluPerspective(90, (double)windowWidth/(double)windowHeight, 0.1, 100); 
     gluLookAt(0,0,5,0,0,-0.1,0.0,1.0,0.0); 



     glMatrixMode(GL_MODELVIEW_MATRIX); 


     if(aPressed) 
      Camera.StrafeRight(-CAMERA_SPEED); 
     if(dPressed) 
      Camera.StrafeRight(CAMERA_SPEED); 
     if(wPressed) 
      Camera.MoveForward(-CAMERA_SPEED); 
     if(sPressed) 
      Camera.MoveForward(CAMERA_SPEED); 
     if(ePressed) 
      Camera.MoveUpward(CAMERA_SPEED); 
     if(qPressed) 
      Camera.MoveUpward(-CAMERA_SPEED); 

     /* Draw Here */ 

     Camera.Render(); 

     /* Draw Cube */ 

     glPushMatrix(); 

     glTranslated(0.0,0.0,0.0); 

     glColor3f(0.0,0.0,0.0); 
     glLineWidth(4); 
     //glutWireCube(1); 
     glColor3f(0.0,0.3,1.0); 
     glNormal3f(0.0,0.0,1.0); 
     glutSolidCube(1); 

     glPopMatrix(); 

     /* Draw Teapot */ 

     glPushMatrix(); 

     glTranslated(3.0,0.0,0.0); 

     glColor3f(0.0,0.0,0.0); 
     glLineWidth(4); 
     glutWireTeapot(1); 
     glColor3f(0.6,0.3,0.0); 
     glutSolidTeapot(1); 

     glPopMatrix(); 

     /* Draw Torus */ 

     glPushMatrix(); 

     glTranslated(-3.0,0.0,0.0); 

     glColor3f(0.0,0.0,0.0); 
     glLineWidth(4); 
     glutWireTorus(0.25, 1, 16, 16); 
     glColor3f(0.6,0.3,0.3); 
     glutSolidTorus(0.25, 1, 16, 16); 

     glPopMatrix(); 


     glfwSwapBuffers(Window); 
     glfwPollEvents(); 
    } 
    glfwDestroyWindow(Window); 

    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 

답변

1

당신은 glut 기능을 사용하는 첫 번째 glutInit를 호출하지 않고 : 여기

는 코드입니다.

main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    ... 

또한 glfwMakeContextCurrent(Window);는 OpenGL을 함수를 먼저 호출해야합니다.

올바른 조명을 얻으려면 실제 표시 행렬을 사용하여 밝은 방향 (-1, -1, -1,0)을 조정하는 것이 좋습니다.

+0

하지만 코드 (camera.cpp + hpp)에서 제공하지 않는 다른 오류가있을 수 있습니다. –

+0

이 경우에는 'glutInit()'도 필요하지 않습니다. OP는 창과 컨텍스트에 glfw를 사용하고 있습니다. GLUT (SGI와 freeglut 모두)의 일반적인 구현은 기술적으로 init이 객체 드로잉 기능을 사용할 필요가 없습니다. – derhass

+0

@derhass :'glutInit'없이 리눅스 (freeglut)에서 작업하게하려면, 프로그램은'glutInit'을 명시 적으로 요청하는 에러로 멈 춥니 다. glfw와 glut 초기화가 충돌하지 않는 것 같습니다 ... –

1

gluLookAt()보기 매트릭스를 만드는 데 사용됩니다. 따라서 매트릭스 모드가 GL_MODELVIEW 일 때 지정해야합니다. 초기 변환 설정 호출 순서는 다음과 같아야합니다.

glMatrixMode(GL_PROJECTION_MATRIX); 
glLoadIdentity(); 
gluPerspective(90.0, (double)windowWidth/(double)windowHeight, 0.1, 100.0); 

glMatrixMode(GL_MODELVIEW_MATRIX); 
glLoadIdentity(); 
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -0.1, 0.0, 1.0, 0.0); 

실제로이 호출 시퀀스를 이벤트 루프 외부로 이동할 수 있습니다. 각 프레임마다 반복 할 필요가 없습니다. 음, gluPerspective() 호출은 창 크기에 따라 다르므로 창 크기가 변경되면 다시 호출해야합니다. 하지만 코드에 윈도우 크기가 고정되어있는 것처럼 보입니다.

glMaterialfv()으로 재질 특성을 설정할 수도 있습니다. 조명을 설정하면 색상 설정에 사용하는 glColor3f() 호출은 원하는 효과를 얻지 못합니다.

물론 다른 답변에서 이미 지적한 것처럼 전에 OpenGL 전화를 걸려면 glfwMakeContextCurrent()으로 전화해야합니다.

여러분이 사용하고있는 대부분의 OpenGL 기능이 더 이상 사용되지 않으며 OpenGL (Core Profile 및 OpenGL ES 2.0 이상)의 최신 버전에서는 더 이상 사용할 수 없다는 것을 알고 계시길 바랍니다.

+0

'GL_PROJECTION_MATRIX'에서 투영법과 카메라 (뷰) 행렬을 결합하는 것이 나에게 좋지는 않지만 개체를 ​​배치하기위한 깨끗한 ID 모델 매트릭스를 제공하지만 어쩌면 내가 누락되었습니다. +1 색상 고려 사항. –

+1

@ j-p 조명 계산은 모델 좌표 변환이 적용된 좌표계 ​​인 눈 좌표로 수행됩니다. 따라서 뷰 변환이 투영 행렬에있는 경우 조명 계산 결과가 잘못됩니다. –

+0

감사합니다. 이제 오래된 파이프 라인을 테스트하는 동안 내 이상한 조명 오류를 이해합니다 ... –