主题:[原创]OpenGL入门学习——第四课
eastcowboy
[专家分:25370] 发布于 2006-08-02 22:33:00
现在放出第四课的内容。
先回顾一下我们都学习了些什么:
[url=http://www.programfan.com/club/showbbs.asp?id=184355]第一课,编写第一个OpenGL程序[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184525]第二课,绘制几何图形[/url]
[url=http://www.programfan.com/club/showbbs.asp?id=184769]第三课,绘制几何图形的一些细节问题[/url]
第四课,颜色的选择 ——→ [color=0000FF]本次课程的内容[/color]
本次学习的是颜色的选择。终于要走出黑白的世界了~~
=====================未完,请勿跟帖=====================
回复列表 (共27个回复)
11 楼
vfdff [专家分:740] 发布于 2006-08-05 20:37:00
#include <GL/glut.h>
#include <math.h>
#include <conio.h>
const int N = 20;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS /* ÔÚÕâÀïÌîÉÏÄãËùÏ£ÍûµÄģʽ */ );
glVertex2f(0.0f, 0.0f);/* ÔÚÕâÀïʹÓÃglVertex*ϵÁк¯Êý */
glVertex2f(0.5f, 0.0f);/* Ö¸¶¨ÄãËùÏ£ÍûµÄ¶¥µãλÖà */
glEnd();
glFlush();
getch(); /*为什么按如一个键,还是不能画出下面的圈呢 ??*/
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}难道一次只能 画一种图的吗??
12 楼
eastcowboy [专家分:25370] 发布于 2006-08-05 22:53:00
getch函数只检测在命令行窗口下按的键。
而我们现在是在OpenGL图形窗口,所以getch不会收到任何信息。
我并不准备讲如何处理键盘和鼠标的事件。
如果需要看到先画一条线,再画第二条,可以使用Sleep函数等待一段时间。
Sleep(3000); // 等待3000毫秒,即3秒。
使用Sleep函数需要加上#include <windows.h>
P.S.
最近两天都没有更新,但这并不表示学习就到此为止。
大家不要着急,我会陆续写出后面的课程的。
13 楼
lybaby [专家分:0] 发布于 2006-08-06 09:51:00
顶一下
14 楼
vfdff [专家分:740] 发布于 2006-08-06 22:13:00
难道 这个新建的窗口就只能处理 图象拉
不能再象普通窗口一样可以接收输入的数据吗 ???
15 楼
eastcowboy [专家分:25370] 发布于 2006-08-07 20:51:00
我们的主题是OpenGL,而OpenGL是一个图形接口,它不包括处理输入输出之类的东西,因此我们需要借助其他工具,比如GLUT。使用glutKeyboardFunc函数可以获取键盘消息,然后就可以处理输入了。(具体的使用方法请自己Google)
当然也可以完全不使用GLUT,自己建立窗口,并处理其中的键盘事件。或者使用控件之类。这就越扯越远了~
16 楼
vfdff [专家分:740] 发布于 2006-08-08 18:45:00
//glutMainLoop();
Sleep(3000); // µÈ´ý3000ºÁÃ룬¼´3Ãë¡£
上面的 glutMainLoop();语句到底还需不需要,我按照你的方式弄好后
用 VC运行的时候 ,在注释 掉 glutMainLoop();的时候 只有出来直线的那个图
而不注释的时候,好象中间并没有间隔 3秒,而是仍然一起两个窗口出来
而且着两个窗口好象都延迟拉一些时间才出来的!!
17 楼
vfdff [专家分:740] 发布于 2006-08-08 18:55:00
#include <stdlib.h>
#include <GL/glut.h>
GLfloat light_ambient[] = {0.1,0.1,0.1,0.0};
GLfloat light_diffuse[] = {1.0,1.0,1.0,0.0};
GLfloat light_specular[] = {1.0,1.0,1.0,0.0};
GLfloat light_position[] = {-10.0,0.0,5.0,0.0};
GLfloat material_ambient[] = {0.1745,0.01175,0.01175};
GLfloat material_diffuse[] = {0.61424,0.04136,0.04136};
GLfloat material_specular[] = {0.727811,0.626959,0.62659};
GLfloat fogColorWhite[] = {1.0,1.0,1.0,1.0};
GLfloat fogColorGreen[] = {0.0,1.0,0.0,1.0};
float fogDensity = 0.02;
void myInit(void)
{
/*设置背景色*/
glClearColor(0.5,0.5,0.5,1.0);
/*设置光照*/
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
/*设置材质*/
glMaterialfv(GL_FRONT,GL_AMBIENT,material_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,material_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,material_specular);
glMaterialf(GL_FRONT,GL_SHININESS,0.6*128);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glFrontFace(GL_CW);
/*设置雾化*/
glEnable(GL_FOG);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogfv(GL_FOG_COLOR,fogColorWhite);
glFogf(GL_FOG_DENSITY,fogDensity);
glFogf(GL_FOG_START,0.0);
glFogf(GL_FOG_END,15.0);
glHint(GL_FOG_HINT,GL_DONT_CARE);
}
/*根据不同的键值设置不同的雾化效果*/
static void myKey(unsigned char key,int x,int y)
{
switch(key)
{
case 33: //shift+1
fogDensity *= 1.10;
glFogi(GL_FOG_MODE,GL_EXP);
glFogf(GL_FOG_DENSITY,fogDensity);
glutPostRedisplay();
break;
case 64: //shift+2
fogDensity /= 1.10;
glFogi(GL_FOG_MODE,GL_EXP);
glFogf(GL_FOG_DENSITY,fogDensity);
glutPostRedisplay();
break;
case 35: //shift+3
glFogi(GL_FOG_START,0.0);
glFogi(GL_FOG_END,8.0);
glutPostRedisplay();
break;
case 36: //shift+4
glFogi(GL_FOG_MODE,GL_EXP2);
glutPostRedisplay();
break;
case 37: //shift+5
glFogi(GL_FOG_MODE,GL_LINEAR);
glutPostRedisplay();
break;
case 94: //shift+6
glFogfv(GL_FOG_COLOR,fogColorGreen);
glutPostRedisplay();
break;
case 27: //Esc
exit(0);
default:
break;
}
}
/*绘制圆锥体*/
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-4.0,4.0,0.0);
glRotatef(30.0,1.0,1.0,0.0);
glutSolidCone(1.0,50.0,20.0,20.0);
glPopMatrix();
glutSwapBuffers();
}
void myReshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(100.0,1.0,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-15.5);
}
int main(int argc,char ** argv)
{
/*初始化*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(300,300);
glutInitWindowPosition(100,100);
/*创建窗口*/
glutCreateWindow(" FOG ");
/*绘制与显示*/
myInit();
glutKeyboardFunc(myKey); // 键处理
glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);
/*进入GLUT事件处理循环*/
glutMainLoop();
return 0;
}
在网上找到这个示例代码
怎么一运行好多错误
希望楼主看看,还需要注意什么??
另外还想为下,能不能再使用以前 那种自己 弄的子程序
这些程序不是以 gl, glut标志 等开始的
18 楼
houfaqing [专家分:2610] 发布于 2006-09-02 13:17:00
UP!~MARK!
19 楼
阿斯兰 [专家分:1700] 发布于 2006-09-26 20:23:00
好久没出了
20 楼
vfdff [专家分:740] 发布于 2006-10-28 00:29:00
第四课终于见到拉
真好
谢谢楼主
我来回复