나는 이미 해결책을 찾았지만 아무 것도 효과가 없었다. 나는 이미 조명을 입혔지만 물체는 모두 꺼져있다.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);
}
하지만 코드 (camera.cpp + hpp)에서 제공하지 않는 다른 오류가있을 수 있습니다. –
이 경우에는 'glutInit()'도 필요하지 않습니다. OP는 창과 컨텍스트에 glfw를 사용하고 있습니다. GLUT (SGI와 freeglut 모두)의 일반적인 구현은 기술적으로 init이 객체 드로잉 기능을 사용할 필요가 없습니다. – derhass
@derhass :'glutInit'없이 리눅스 (freeglut)에서 작업하게하려면, 프로그램은'glutInit'을 명시 적으로 요청하는 에러로 멈 춥니 다. glfw와 glut 초기화가 충돌하지 않는 것 같습니다 ... –