OpenGLのglColor関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DOG
記事: 27
登録日時: 10年前

OpenGLのglColor関数について

#1

投稿記事 by DOG » 10年前

演習問題として、アフィン変換の順序を確かめるためのプログラムを書きました。
ここで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);
}

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: OpenGLのglColor関数について

#2

投稿記事 by beatle » 10年前

水色に描画したくない頂点は、明示的に水色以外の色をglColorで指定したらどうでしょう。

DOG
記事: 27
登録日時: 10年前

Re: OpenGLのglColor関数について

#3

投稿記事 by DOG » 10年前

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

hide

Re: OpenGLのglColor関数について

#4

投稿記事 by hide » 10年前

あなたは画家で画を壁に描きます。
そしてopenGLは画材道具ですね。

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

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: OpenGLのglColor関数について

#5

投稿記事 by h2so5 » 10年前

glColor3d を実行するとそれ以降のすべての描画に対して影響を与えます。
display()はなんども実行されますから、最初の1回だけを除いてすべて指定した色で描画でれてしまいます。

DOG
記事: 27
登録日時: 10年前

Re: OpenGLのglColor関数について

#6

投稿記事 by DOG » 10年前

>>hideさん
分かりやいイメージを与えてくださり、ありがとうございます。
おかげで頭にすんなりと入りました。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る