2011-04-14 17 views
0

私は、OpenGLのプールテーブルの上に 'スポットライト'を作ろうとしています。これはかなりシンプルなはずですが、何かがうまくいかず、何ができないのでしょうか。OpenGLスポットライト

私はライトのための一種の保持クラスとして使用しているクラス '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); 
} 

と表示中

:: INIT、私はこのコードを持っています毛布の照明。

私はおそらく何かが明らかに欠けているように感じますが、私はちょうど何が見えません。

+0

角度がラジアンで指定されていませんか?あなたの角度として '60'を使うと、あなたは度を使っているようです。 – ChrisF

+0

私はそれを(60.0 *(3.1415/180))に変更しましたが、無駄です。 – Xenoprimate

+0

ええと、今は他のことは考えられません - ごめんなさい。 – ChrisF

答えて

1

これは、OpenGLのデフォルトの固定機能パイプラインがどのように照明を実装しているかによるものです。照明は頂点でのみ評価され、その結果得られる色はサーフェス上に補間されます。テーブル全体が1つの大きなクワッドで構成されている場合、まさにこれが起こります。

解決策1:メッシュを高度に細分します。

解決策2:固定機能照明をフラグメント照明シェーダに置き換えます。

+0

メッシュは既に20の三角形になっていましたが、私はそれを200にしましたが、違いはありません。私は固定機能の照明を使用しなければなりません(それは授業の一部です)、今は他の方法を学ぶ時間がありません。 :<スクリーンショットをご希望ですか? – Xenoprimate

+1

はい、いくつかのスクリーンショットを提供してください。また、メッシュ自体の描画方法を示すコードもいくつか用意してください。 – datenwolf

関連する問題