2011-04-14 4 views
0

OpenGL의 풀 테이블 위에 '스포트라이트'를 만들려고합니다. 이것은 매우 간단해야하지만, 뭔가 잘못되고, 나는 무엇을 해결할 수 없습니다.OpenGL Spotlights

클래스 'PoolLight'를 사용하고 있습니다. 클래스 라이트를 유지하는 클래스로 사용하고 있습니다. 여기입니다 : 내 장면이 균일하게 '의 일종으로 점등 중앙 스포트라이트를 제외하고 모두 해제하더라도, 그러나

glEnable(GL_TEXTURE_2D); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_LIGHTING); 
glPointSize(6); 

//Lighting 
middleSpotlight = PoolLight(GL_LIGHT0, GL_DIFFUSE, .3, .3, 0.15, false, 0, 0, 50); 
middleSpotlight.setSpotlight(60, 1, 0, 0, -1); 
upperSpotlight = PoolLight(GL_LIGHT1, GL_DIFFUSE, .3, .3, 0.15, false, 0, 45, 50); 
upperSpotlight.setSpotlight(60, 1, 0, 0, -1); 
lowerSpotlight = PoolLight(GL_LIGHT2, GL_DIFFUSE, .3, .3, 0.15, false, 0, -45, 50); 
lowerSpotlight.setSpotlight(60, 1, 0, 0, -1); 

:

#include "PoolLight.h" 
#include "Glut/glut.h" 
#include "GL/gl.h" 
#include "GL/glu.h" 

PoolLight::PoolLight() { 

} 

PoolLight::PoolLight(GLenum lightNumber, GLenum lightType, float red, float green, float blue, bool distant, float posX, float posY, float posZ) 
{ 
    this->lightNumber = lightNumber; 
    this->lightType = lightType; 

    color[0] = red; color[1] = green; color[2] = blue; color[3] = 1; 
    position[0] = posX; position[1] = posY; position[2] = posZ; position[3] = (int) (!distant); 
    glLightfv(lightNumber, lightType, color); 
    glLightfv(lightNumber, GL_POSITION, position); 

    enabled(true); 
} 


PoolLight::~PoolLight(void) 
{ 
} 

void PoolLight::setSpotlight(float angle, float attenuation, float dirX, float dirY, float dirZ) { 
    glLightf(lightNumber, GL_SPOT_EXPONENT, angle); 
    glLightf(lightNumber, GL_CONSTANT_ATTENUATION, attenuation); 
    glLightf(lightNumber, GL_LINEAR_ATTENUATION, 0.0f); 
    glLightf(lightNumber, GL_QUADRATIC_ATTENUATION, 0.0f); 
    spotDirection[0] = dirX; spotDirection[1] = dirY; spotDirection[2] = dirZ; 
    glLightfv(lightNumber, GL_SPOT_DIRECTION, spotDirection); 
    glLightf(lightNumber, GL_SPOT_CUTOFF, 60); 
} 

void PoolLight::enabled(bool enabled) { 
    if (enabled) glEnable(lightNumber); 
    else glDisable(lightNumber); 
} 

void PoolLight::reposition() { 
    glLightfv(lightNumber, GL_POSITION, position); 
} 

그리고 디스플레이에

:: 초기화,이 코드를 담요 '조명.

나는 분명히 뭔가 빠져있는 것처럼 느껴진다.하지만 나는 무엇을 볼 수 없다.

+0

각도가 라디안 단위로 지정되지 않았습니까? '60'을 각도로 사용하면도를 사용하는 것처럼 보입니다. – ChrisF

+0

나는 그것을 (60.0 * (3.1415/180))로 바꾸었지만 아무 소용이 없다. – Xenoprimate

+0

흠, 지금은 다른 생각을 할 수 없습니다 - 죄송합니다. – ChrisF

답변

1

이것은 OpenGL 기본 고정 함수 파이프 라인이 조명을 구현하는 방법에 의한 것입니다. 조명은 정점에서만 평가되고 결과 색상은 표면에 보간됩니다. 전체 테이블이 단지 하나의 커다란 쿼드로 구성되어 있다면 정확히 이런 일이 발생합니다.

해결책 1 : 메시를 높은 수준으로 세분화합니다.

해결 방법 2 : 고정 함수 조명을 조각 별 조명 쉐이더로 바꿉니다.

+0

메쉬는 이미 20 개의 삼각형으로되어 있었지만 방금 200으로 만들었고 아무런 차이가 없었습니다. 고정 기능 조명 (교과 과정)을 사용해야하며 다른 방법을 배우는 데 시간이 없습니다. : <스크린 샷을 원하십니까? – Xenoprimate

+1

네, 일부 스크린 샷과 메쉬 그릴을 보여주는 코드도 제공하십시오. – datenwolf