現在地 >> メニュー >> サンプルコード::OpenGL >> 光源の各種設定

問題


光源のパラメータ「GL_AMBIENT」、「GL_DIFFUSE」、「GL_SPECULAR」を設定し、物体を描画せよ。

その他条件:
右ボタンでメニューを表示し、設定を切替える

光源の設定

答え


#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <iostream>

enum{NONE = 0,AMB,SPEC,DIFF};


void display();
void reshape(int w, int h);
void timer(int value);
void menu(int val);


using namespace std;


/*******************[OpenGLの初期設定]************************/
inline void GLUT_INIT()
{
glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(200,200);
}

inline void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(1,timer,0);
}

inline void GLUT_SET_MENU()
{

glutCreateMenu(menu);
glutAddMenuEntry("AMB", AMB);
glutAddMenuEntry("SPEC", SPEC);
glutAddMenuEntry("DIFF", DIFF);
glutAddMenuEntry("NONE", NONE);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}



/*********[光源のデフォルト]***********/
GLfloat light0_pos[] = { 3.0, 4.0, 5.0, 1.0 };
GLfloat amb_default[] = {0.0, 0.0, 0.0, 1.0};
GLfloat diff_default[] = {1.0, 1.0, 1.0, 1.0};
GLfloat spec_default[] = {1.0, 1.0, 1.0, 1.0};

inline void MY_INIT()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
glLightfv(GL_LIGHT0, GL_AMBIENT, amb_default);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_default);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_default);
}


int main(int argc, char **argv)
{
glutInit(&argc,argv);
GLUT_INIT();
glutCreateWindow("window name");
GLUT_CALL_FUNC();
GLUT_SET_MENU();
MY_INIT();
glutMainLoop();

return 0;
}


/**************[ここから、各種コールバック]************/
void display()
{
static int r = 0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);


glEnable(GL_DEPTH_TEST);


glPushMatrix();
glRotated((double)r, 0.0, 1.0, 0.0);

glutSolidSphere(1,60,60);

glPopMatrix();


glDisable(GL_DEPTH_TEST);


glutSwapBuffers();

r = r + 1;
if(r > 360)
{
r= 0;
}
}


void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(1,timer,0);
}



GLfloat light0_ambient[] = {0.0, 0.0, 1.0, 1.0};
GLfloat light0_specular[] = {0.0, 1.0, 0.0, 1.0};
GLfloat light0_diffuse[] = {1.0, 0.0, 0.0, 1.0};
void menu(int val)
{
switch(val)
{

case NONE:
glLightfv(GL_LIGHT0, GL_AMBIENT, amb_default);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_default);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_default);
break;

case AMB:
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
break;

case SPEC:
glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
break;


case DIFF:
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
break;

}
}

メモ


このプログラムではSPECULARを設定しても、何もおこらない。(材質の都合上)


環境光:青
鏡面光:緑
拡散光:赤

とした。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます