ページ 11

OpenGLのglColor関数について

Posted: 2014年2月11日(火) 12:50
by DOG
演習問題として、アフィン変換の順序を確かめるためのプログラムを書きました。
ここで50行目に
glColor3d(0.0, 1.0, 1.0);
を使っているのですが、なぜか、XYZ軸と全ての三角形が水色になってしまいます。
glColor3d(0.0, 1.0, 1.0);
以下の描画だけにしか色が適用されるのではないのでしょうか?

コード内容を書きます。(プログラム初心者なので見づらいかと思いますが、ご了承ください)

コード:

#include <gl/glut.h>

void display(void);
void reshape(int w, int h);

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
	glutCreateWindow("DEPTH_TEST");

	glutDisplayFunc(display);
	glutReshapeFunc(reshape);

	glClearColor(0.f, 0.f, 0.f, 1.f);

	glutMainLoop();

	return 0;

}

void display(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_DEPTH_TEST);
       /*  XYZ軸を書く  */
	glBegin(GL_LINES);
		glVertex3d(0.0, 0.0, 0.0);
		glVertex3d(100.0, 0.0, 0.0);
		glVertex3d(0.0, 0.0, 0.0);
		glVertex3d(0.0, 100.0, 0.0);
		glVertex3d(0.0, 0.0, 0.0);
		glVertex3d(0.0, 0.0, 100.0);
	glEnd();
	glPushMatrix();
	glTranslated(1.0, 1.0, 1.0);
	glRotated(30.0, 0.0, 1.0, 0.0);
	glBegin(GL_TRIANGLES);
		glVertex3d(0.0, 0.5, 0.0);
		glVertex3d(-0.5, -0.5, 0.0);
		glVertex3d(0.5, -0.5, 0.0);
	glEnd();
	glPopMatrix();

	glPushMatrix();
	glRotated(30.0, 0.0, 1.0, 0.0); 
	glTranslated(1.0, 1.0, 1.0);
	glBegin(GL_TRIANGLES);
	glColor3d(0.0, 1.0, 1.0);
		glVertex3d(0.0, 0.5, 0.0);
		glVertex3d(-0.5, -0.5, 0.0);
		glVertex3d(0.5, -0.5, 0.0);
	glEnd();
	glPopMatrix();
	glDisable(GL_DEPTH_TEST);

	glFinish();
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w /(double) h, 0.1, 200.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1.0, 2.5, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

Re: OpenGLのglColor関数について

Posted: 2014年2月11日(火) 13:50
by beatle
水色に描画したくない頂点は、明示的に水色以外の色をglColorで指定したらどうでしょう。

Re: OpenGLのglColor関数について

Posted: 2014年2月11日(火) 15:30
by DOG
beatleさん、返答ありがとうございます。
たしかに、明示的に書くことで色に違いを出すことができました。
デフォルトではglColorは白で設定されているから、背景を黒にすればわざわざ書かなくてもいいかなと思い、
glColorは一か所にしか書かなかったのですが、やはり明示的に書かないとコンピュータが混乱(?)してしまうのでしょうか。

Re: OpenGLのglColor関数について

Posted: 2014年2月11日(火) 16:06
by hide
あなたは画家で画を壁に描きます。
そしてopenGLは画材道具ですね。

あなたは、壁に絵を書いてほしいと言われたので、
用意してある初期状態の絵の具で壁に線を書き、次に水色の絵の具で、線を書きました。
壁には白と水色の線が描かれました。

しばらくして、壁が汚れて再描画命令が来たので、
用意してある前回の絵の具で壁に線を書き、次に水色の絵の具で、線を書きました。
壁には水色と水色の線が描かれました。

ということだと思います。

Re: OpenGLのglColor関数について

Posted: 2014年2月11日(火) 18:39
by h2so5
glColor3d を実行するとそれ以降のすべての描画に対して影響を与えます。
display()はなんども実行されますから、最初の1回だけを除いてすべて指定した色で描画でれてしまいます。

Re: OpenGLのglColor関数について

Posted: 2014年2月11日(火) 22:29
by DOG
>>hideさん
分かりやいイメージを与えてくださり、ありがとうございます。
おかげで頭にすんなりと入りました。

>>h2so5さん
>display()はなんども実行されますから、
なるほど、ここがキーポイントですね。
OpenGLがステート・マシンということを考えれば確かに全て水色で描画されてしまいますね。

hideさん、h2so5さん、返答ありがとうございました。