用opengl在天空盒里面画东西结果天空盒的颜色被改变了

用opengl在天空盒里面画东西结果天空盒的颜色被改变了,第1张

你画天空盒之前再调用下

glColor3f(10f , 10f , 10f);

好不好

GL是个状态机 ,你设置了一种状态,他就一直是那种状态了除非你去改变它!

这个问题我遇到过,可以先保存当前的颜色,然后用新的颜色画,再拿出原来的颜色,例子如下:

我想画一个东西,但又不想影响到Opengl当前的颜色状态,可以这样用glPushAttrib(GL_CURRENT_BIT);

例如:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(-15f,00f,-100f);

glColor3f(10f,00f,00f);

glBegin(GL_TRIANGLES);

glVertex3f( 00f, 10f, 00f); // Top

glVertex3f(-10f,-10f, 00f); // Bottom Left

glVertex3f( 10f,-10f, 00f); // Bottom Right

glEnd(); // Finished Drawing The Triangle

glTranslatef(30f,00f,00f); // Move Right 3 Units

glPushAttrib(GL_CURRENT_BIT);

glColor3f(00f,10f,00f);

glBegin(GL_QUADS); // Draw A Quad

glVertex3f(-10f, 10f, 00f); // Top Left

glVertex3f( 10f, 10f, 00f); // Top Right

glVertex3f( 10f,-10f, 00f); // Bottom Right

glVertex3f(-10f,-10f, 00f); // Bottom Left

glEnd(); // Done Drawing The Quad

glPopAttrib();

glTranslatef(30f,00f,00f);

glBegin(GL_TRIANGLES); // Drawing Using Triangles

glVertex3f( 00f, 10f, 00f); // Top

glVertex3f(-10f,-10f, 00f); // Bottom Left

glVertex3f( 10f,-10f, 00f); // Bottom Right

glEnd();

画绿色的四边形时不影响到当前的颜色状态

  #include <windowsh>

  #include <gl/gluth>

  #include<gl/glh>

  #include<gl/gluh>

  // 函数RenderScene用于在窗口中绘制需要的图形

  void RenderScene(void)

  {

  //用当前清除色清除颜色缓冲区,即设定窗口的背景色

  glClear(GL_COLOR_BUFFER_BIT);

  //设置当前绘图使用的RGB颜色

  glColor3f(10f, 00f, 00f);

  //使用当前颜色绘制一个填充的矩形

  glRectf(1000f, 1500f, 1500f, 1000f);

  //刷新OpenGL命令队列

  glFlush();

  }

  // 函数ChangeSize是窗口大小改变时调用的登记函数

  void ChangeSize(GLsizei w, GLsizei h)

  {

  if(h == 0) h = 1;

  //设置视区尺寸

  glViewport(0, 0, w, h);

  // 重置坐标系统,使投影变换复位

  glMatrixMode(GL_PROJECTION);

  glLoadIdentity();

  // 建立修剪空间的范围

  if (w <= h)

  glOrtho (00f, 2500f, 00f, 2500fh/w, 10f, -10f);

  else

  glOrtho (00f, 2500fw/h, 00f, 2500f, 10f, -10f);

  glMatrixMode(GL_MODELVIEW);

  glLoadIdentity();

  }

  //函数SetupRC用于初始化,常用来设置场景渲染状态

  void SetupRC(void)

  {

  // 设置窗口的清除色为白色

  glClearColor(10f, 10f, 10f, 10f);

  }

  void main(void)

  {

  //初始化GLUT库OpenGL窗口的显示模式

  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

  // 创建一个名为GLRect的窗口

  glutCreateWindow("GLRect");

  // 设置当前窗口的显示回调函数和窗口再整形回调函数

  glutDisplayFunc(RenderScene);

  glutReshapeFunc(ChangeSize);

  SetupRC();

  //启动主GLUT事件处理循环

  glutMainLoop();

  }

  171 库和头文件 程序GLRect中包含了4个头文件,其中定义了程序所用的函数原形。此外,OpenGL需要下列lib包含在你的工程中:opengllib,glulib,glut32lib;另外在运行程序路径下或\win98\system\(\winNT\system32)下需要一些动态连接库:opengl32dll,glu32dll,glut32dll。

  172 函数主体

  我们先看所有C程序的入口点:

  void main(void)

  {

  1 显示模式

  第一行代码如下:

  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

  它告诉GLUT库在创建窗口时使用单缓冲区窗口(GLUT_SINGLE)并使用RGB颜色模式(GLUT_RGB)。由于在屏幕上显示图形是由像素构成的,而像素的颜色及灰度信息都是存储在帧缓冲存储区中,单缓冲区窗口使用单一的帧缓冲存储区,这样所有的绘图命令都在显示窗口中执行;另一种是双缓冲区窗口(GLUT_DOUBLE),它使用了两个帧缓冲存储区,这样在窗口中执行的绘图命令实际上利用其中一个帧缓冲存储区创建一个场景,然后很快地交换到窗口视图中来,这种方法常用于产生动画效果的场合。RGB颜色模式意味着要通过分别提供红、绿、蓝成分的浓度来指定颜色。

  2 创建OpenGL窗口

  下一行代码:

  glutCreateWindow("GLRect");

  它利用glut库中的窗口管理函数在屏幕上创建一个标题为“GLRect”的窗口。

  3 回调函数

  后面的两行代码

  glutDisplayFunc(RenderScene);

  glutReshapeFunc(ChangeSize);

  分别用于指定当前窗口的显示回调函数和再整形回调函数。回调函数是响应某种事件而被调用的函数,他由程序员编制,通过GLUT注册函数连接到特定的函数。这样只要需要绘制窗口,GLUT就会调用函数RenderScene;而当窗口的大小或形状发生变化时,GLUT会调用函数ChangeSize。

  4.设置上下文并执行

  SetupRC()函数与GLUT框架无关,其作用是进行OpenGL的初始化。OpenGL的初始化必须在渲染之前进行,由于OpenGL使用状态机,即每条OpenGL命令都使用当前的渲染状态完成,而对当前渲染状态的任何修改都会影响到之后的任何OpenGL命令,直至再次修改当前渲染状态,故此在一个场景中,许多的状态只要设置一次就可以了。

  程序的结尾是最后一个GLUT函数调用:

  glutMainLoop( );

  }

  该函数让GLUT框架开始运行,所有设置的回调函数开始工作,直到用户终止程序为止。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12182044.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存