回 帖 发 新 帖 刷新版面

主题:[原创]OpenGL入门学习——第四课

现在放出第四课的内容。
先回顾一下我们都学习了些什么:

[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 楼

#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 /* &Ocirc;&Uacute;&Otilde;&acirc;&Agrave;&iuml;&Igrave;&icirc;&Eacute;&Iuml;&Auml;&atilde;&Euml;ù&Iuml;&pound;&Iacute;&ucirc;&micro;&Auml;&Auml;&pound;&Ecirc;&frac12; */ );
        glVertex2f(0.0f, 0.0f);/* &Ocirc;&Uacute;&Otilde;&acirc;&Agrave;&iuml;&Ecirc;&sup1;&Oacute;&Atilde;glVertex*&Iuml;&micro;&Aacute;&ETH;&ordm;&macr;&Ecirc;&yacute; */
        glVertex2f(0.5f, 0.0f);/* &Ouml;&cedil;&para;¨&Auml;&atilde;&Euml;ù&Iuml;&pound;&Iacute;&ucirc;&micro;&Auml;&para;&yen;&micro;&atilde;&Icirc;&raquo;&Ouml;&Atilde; */
    glEnd();
    glFlush();
     getch();  /*为什么按如一个键,还是不能画出下面的圈呢 ??*/
    glBegin(GL_LINES); 
        glVertex2f(0.0f, 0.0f);
        glVertex2f(0.5f, 0.0f);
    glEnd();
    glFlush();
}难道一次只能 画一种图的吗??

12 楼

getch函数只检测在命令行窗口下按的键。
而我们现在是在OpenGL图形窗口,所以getch不会收到任何信息。

我并不准备讲如何处理键盘和鼠标的事件。
如果需要看到先画一条线,再画第二条,可以使用Sleep函数等待一段时间。
Sleep(3000); // 等待3000毫秒,即3秒。

使用Sleep函数需要加上#include <windows.h>



P.S.
最近两天都没有更新,但这并不表示学习就到此为止。
大家不要着急,我会陆续写出后面的课程的。

13 楼

顶一下

14 楼

难道 这个新建的窗口就只能处理 图象拉 
不能再象普通窗口一样可以接收输入的数据吗 ???

15 楼

我们的主题是OpenGL,而OpenGL是一个图形接口,它不包括处理输入输出之类的东西,因此我们需要借助其他工具,比如GLUT。使用glutKeyboardFunc函数可以获取键盘消息,然后就可以处理输入了。(具体的使用方法请自己Google)
当然也可以完全不使用GLUT,自己建立窗口,并处理其中的键盘事件。或者使用控件之类。这就越扯越远了~

16 楼

//glutMainLoop();
    
    Sleep(3000); // &micro;&Egrave;&acute;&yacute;3000&ordm;&Aacute;&Atilde;&euml;&pound;&not;&frac14;&acute;3&Atilde;&euml;&iexcl;&pound;
上面的 glutMainLoop();语句到底还需不需要,我按照你的方式弄好后 
用 VC运行的时候 ,在注释 掉 glutMainLoop();的时候 只有出来直线的那个图
而不注释的时候,好象中间并没有间隔 3秒,而是仍然一起两个窗口出来 
而且着两个窗口好象都延迟拉一些时间才出来的!!

17 楼

#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 楼

UP!~MARK!

19 楼

好久没出了

20 楼

第四课终于见到拉 
真好 
谢谢楼主

我来回复

您尚未登录,请登录后再回复。点此登录或注册