2016-05-27 15 views
1

OpenGLでスポットライトを使用する方法を学習しようとしています。私は3D空間で(possph)を中心とするGLUTティーポットの側面に、点(lighpos)とマークされた点(トーチ)の光を照らし、灰色の点で示したいと思います。私はこれをやろうとした例を付けましたが、光をティーポットに集中させることはできません。私は使用しようとしているパラメータに基づいて、ほとんど触れる光の焦点を期待しています。OpenGLでスポットライトを使用する方法

誰かが私が逃した/間違ったことを指摘できますか?あなたのコード内で使用しているものである

おかげ

スチュアート

#include <windows.h> 
#include <GL/glut.h> 
#include <stdio.h> 

GLfloat lighpos[] = { -300., 200., 250., 1.0 }; // Location of light 
GLfloat possph[] = { -50., 350., 150. }; // Position of teapot 
GLfloat ligdir[] = { 250., 150., -100. }; // Direction from light to teapot 

void init(void) { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_COLOR_MATERIAL); 
    glEnable(GL_DEPTH_TEST); 

    glLightfv(GL_LIGHT0, GL_POSITION, lighpos); 
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, ligdir); 
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 10.0); 

    GLfloat ambientLight0[] = { 0.25, 0.25, 0.25, 1.0 }; 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0); 
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight0); 

    GLfloat diffuseLight0[] = { 1.0, 1.0, 1.0, 1.0 }; 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0); 

    GLfloat specularLight0[] = { 1.0, 1.0, 1.0, 1.0 }; 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0); 

    glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 128.0f); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
} 

void drawAxis() { 
    glBegin(GL_LINES); 
    glColor3f(1.0, 0.0, 0.0); glVertex3f(-500., 0.0, 0.0); glVertex3f(500., 0.0, 0.0); 
    glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, -500., 0.0); glVertex3f(0.0, 500., 0.0); 
    glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, -500.); glVertex3f(0.0, 0.0, 500.); 
    glEnd(); 
} 

void display(void) { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 
    drawAxis(); 
    glPushMatrix(); 
    glPointSize(10); 
    glColor3f(1.0, 1.0, 1.0); 
    glBegin(GL_POINTS); 
    glVertex3d(lighpos[0], lighpos[1], lighpos[2]); 
    glEnd(); 
    glPopMatrix(); 

    glColor3f(1., 0., 0.); 
    glPushMatrix(); 
    glTranslated(possph[0], possph[1], possph[2]); 
    glutSolidTeapot(100.); 
    glPopMatrix(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) { 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 4, 3000.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(1500.0, 1500.0, 1500.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
} 


int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowPosition(0.0, 0.0); 
    glutInitWindowSize(800, 800);  
    glutCreateWindow("spotlight"); 
    init(); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape);    
    glutMainLoop(); 
    return 0; 
} 

答えて

0

固定機能パイプライン照明は、頂点のみでライティング計算を実行します。あなたのスポットライトが数個または単一の頂点しか照明しない場合、あなたは喜ばしいスポットライト効果を得ません。考えられる解決策の1つは、モデルのメッシュをきめ細かく調整することです。より良い、はるかに効率的でエレガントなソリューションは、固定機能パイプラインを使用して落とし、照明フラグメントシェーダを実装することで、各ピクセルに対して照明が計算されるようにすることです。

関連する問題