1

この部屋に電球効果を持たせようとしていますが、何が悪いのかわかりません。現時点では、光は球の上部と円錐の側面を照らしているように見え、壁には光がまったく当たっていません。位置と方向をいじってみましたが、何も機能していません。

#include <GLUT/glut.h>
#include <stdio.h>
#include <stdlib.h>
//Global variables
double sphere = 1, cone = 1, viewy = 2, viewx = -10, viewz = 5,headup = 5,headright = 5;
void myinit(){
    glClearColor(0,0,0,1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,1,1,100);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    //glOrtho(-2,20,-2,20,-10,10);
}
void drawRoom(){
    //floor
    glBegin(GL_POLYGON);
    glColor3f(1,1,1);
    glVertex3f(0,0,0);
    glVertex3f(0,10,0);
    glVertex3f(10,10,0);
    glVertex3f(10,0,0);
    glEnd(
    );
    //wall
    glBegin(GL_POLYGON);
    glColor3f(0,0,1);
    glVertex3f(0,10,0);
    glVertex3f(0,10,10);
    glVertex3f(10,10,10);
    glVertex3f(10,10,0);
    glEnd();
    //wall2
    glBegin(GL_POLYGON);
    glColor3f(0,1,0);
    glVertex3f(10,10,0);
    glVertex3f(10,10,10);
    glVertex3f(10,0,10);
    glVertex3f(10,0,0);
    glEnd();
}
void drawObjects(){
    //draw cone
    glShadeModel(GL_FLAT);
    glColor3f(1,0,1);
    glTranslatef(2,2,0);
    glutSolidCone(cone,5,10,2);
    //draw sphere
    glShadeModel(GL_SMOOTH);
    glTranslatef(5,5,0);
    glColor3f(1,0,0);
    glutSolidSphere(sphere,500,500);

}
void move(unsigned char key, int x, int y){
    switch(key){
        case 'y': 
            viewy++;
            glutPostRedisplay();
            break;
        case 'x':
            viewx++;
            glutPostRedisplay();
            break;
        case 'z':
            viewz++;
            glutPostRedisplay();
            break;
        case 'Z':
            viewz--;
            glutPostRedisplay();
            glutPostRedisplay();
            break;
        //moves head
        case 'd':
            headup--;
            headright--;
            glutPostRedisplay();
            break;
        case 'a':
            headup++;
            headright++;
            glutPostRedisplay();
            break;
    }
}

void display(){
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(viewx,viewy,viewz,headup,headright,5,0,0,1);
    glClear(GL_COLOR_BUFFER_BIT);
    drawRoom();
    GLfloat light_position[] = {5.0,5.0,10.0,0.0};
    GLfloat light_direction[] = {-5,-5,-5};
    GLfloat amb[] = {0,0,0,1};
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,light_direction);
    glLightfv(GL_LIGHT0, GL_AMBIENT,amb);
    drawObjects();
    glutSwapBuffers();
    glFlush();
}
int main (int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Room");
    myinit();
    glutDisplayFunc(display);
    glutKeyboardFunc(move);
    //glutMotionFunc(moveHead);
    glutMainLoop();
    return 0;
}
4

1 に答える 1

3

1番目:法線を指定する必要があります。

2番目:OpenGL固定関数パイプラインは、頂点でのみ照明を評価し、次に重心色補間を実行します。内部のどこかに光源があるボックスのコーナーは、最も少ない光を受け取ります。6つのクワッドだけで構成されるボックスでは、適切なフォールオフは得られませんが、薄暗い壁だけが得られます。フラグメントシェーダーを使用してフラグメントごとのライティングを実装するか(推奨)、クワッドを壁を形成する適切な数の小さなクワッドにテッセレーションして、イルミネーションが評価される十分な補間サンプリングポイントを確保する必要があります。

于 2012-11-20T22:16:06.297 に答える