OpenGL学习二--基础知识

名称解释:

渲染render:对一个三维物体进行几何描述并且把它转换成为屏幕上的一幅图像。

透视:指直线之间的角度。

纹理贴图texture mapping:通过一幅图像向一个多边形提供额外细节的技巧称为纹理贴图

纹理texture:我们所提供的图像。

纹理单元texel:纹理中每个单独的元素。

过滤filtering:在一个物体的表面上拉伸或压缩纹理单元的过程

 

混合blending:屏幕上颜色或物体的组合。

抗锯齿antialiasing:

 

保持模式retained mode:我们向API或者工具箱提供物体或场景的高层几何描述。

立即模式immediate mode:我们按照一次一片的方式创建几何物体。

视口viewport:窗口内部用于绘制裁剪区域的客户区域。

 

管线pipeline

 

第一个程序

#include

 

void RenderScene(void){

         glClear(GL_COLOR_BUFFER_BIT);

         glColor3f(1.0f,0.0f,0.0f);

         glRectf(-25.0f,25.0f,25.0f,-25.0f);

         glFlush();

}

 

void SetupRC(void){

         glClearColor(0.0f,0.0f,1.0f,1.0f);

}

 

int main(int argc, char *argv[])

 

{

     glutInit(&argc, argv);

     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);

     glutInitWindowPosition(0, 0);

     glutInitWindowSize(800, 600);

     glutCreateWindow("第一个OpenGL程序");

 

     glutDisplayFunc(RenderScene);

          SetupRC();

     glutMainLoop();

     return 0;

}

 

画点

glBegin(GL_POINTS);

glVertex3f(0.0f, 0.0f,0.0f);       

glEnd();

 

设置点的大小:

在指定图元之前指定点的大小:

glpointSize(**);

 

 

画线:

glBegin(GL_POINTS);

glVertex3f(0.0f, 0.0f,0.0f);       

glVertex3f(50.0f, 50.0f,50.0f);

glEnd();

 

画线带:

glBegin(GL_POINT_STRIP);

glVertex3f(0.0f, 0.0f,0.0f);       

glVertex3f(50.0f, 50.0f,0.0f);

glVertex3f(50.0f, 100.0f,0.0f);

glEnd();

 

画线环:

glBegin(GL_POINT_LOOP);

glVertex3f(0.0f, 0.0f,0.0f);       

glVertex3f(50.0f, 50.0f,0.0f);

glVertex3f(50.0f, 100.0f,0.0f);

glEnd();

 

 

设置线的宽度:

glLineWidth(**);

 

画直线点画:

首先要启用点画(stippling)

glEnable(GL_LINE_STIPPLE));

glLineStipple(factor,pattern);其中factor是点画乘法因子 pattern代表点画模式例如0x5555

 

 

 

画三角形:

glBegin(GL_TRIANGLES);

 

glVertex2f(0.0f, 0.0f);      

glVertex2f(50.0f, 50.0f);

glVertex2f(50.0f,0.0f);

 

glVertex2f(-50.0f, 0.0f);  

glVertex2f(-75.0f, 50.0f);

glVertex2f(-25.0f,0.0f);

glEnd();

 

画三角形扇:

glBegin(GL_TRIANGLE_FAN);

 

glVertex3f(0.0f, 0.0f,75.0f);    

glColor3f(1.0f,1.0f,1.0f);

……..

glEnd();

 

 

创建菜单:

void ProcessMenu(int value)

{

         switch(value)

         {

         case 1:

                   iDepth = !iDepth;

                   break;

 

         case 2:

                   iCull = !iCull;

                   break;

 

         case 3:

                   iOutline = !iOutline;

         default:

                   break;

         }

 

         glutPostRedisplay();

}

 

然后再main函数里:

 

glutCreateMenu(ProcessMenu);

glutAddMenuEntry("Toggle depth test",1);

glutAddMenuEntry("Toggle cull backface",2);

glutAddMenuEntry("Toggle outline back",3);

glutAttachMenu(GLUT_RIGHT_BUTTON);

 

 

深度测试:一种有效的用于隐藏表面消除的技巧。

当一个像素被绘制时,它将被设置一个值(成为z值),以表示它和观察者之间的距离。以后当这个屏幕位置需要绘制另一个像素时,新像素的z值就会与原来已经存储的那个像素进行比较。如果新的z值更高,他就更靠近观察者。否则,它必须位于原来那个像素的后面。

启用深度测试:

glEnable(GL_DEPTH_TEST);

禁用: glDisable(GL_DEPTH_TEST);

 

剔除:消除已经知道肯定不会被显示的几何图形

背面剔除,用于消除一个表面的背面

启用:glEnable(GL_CULL_FACE);

禁用:glDisable(GL_CULL_FACE);

 

多边形模式:

指定只绘制多边形的外框,甚至只绘制点(只有顶点被绘制)。glPolygonMode函数允许多边形作为实心图形、外框或点进行渲染。另外,也可以对多边形的两面都应用这个渲染模式,也可以只对多边形的正面或背面应用这个模式。

线框:glPolygonMode(GL_BACK,GL_LINE); 这里只把背面绘制成一个多边形

实心:glPolygonMode(GL_BACK,GL_FILL);

 

 

键盘上下左右操作:

void SpecialKeys(int key, int x, int y)

{

         if(key == GLUT_KEY_UP)

                   xRot-= 5.0f;

 

         if(key == GLUT_KEY_DOWN)

                   xRot += 5.0f;

 

         if(key == GLUT_KEY_LEFT)

                   yRot -= 5.0f;

 

         if(key == GLUT_KEY_RIGHT)

                   yRot += 5.0f;

 

         if(key > 356.0f)

                   xRot = 0.0f;

 

         if(key < -1.0f)

                   xRot = 355.0f;

 

         if(key > 356.0f)

                   yRot = 0.0f;

 

         if(key < -1.0f)

                   yRot = 355.0f;

 

         // Refresh the Window

         glutPostRedisplay();

}

 

 

在main函数中调用:

         glutSpecialFunc(SpecialKeys);

 

 

 

 

隐藏和显示边界:

GLboolean bEdgeFlag = TRUE;

 

 

void ProcessMenu(int value)

         {

         switch(value)

                   {

                   case 1:

                            iMode = MODE_SOLID;

                            break;

 

                   case 2:

                            iMode = MODE_LINE;

                            break;

 

                   case 3:

                            iMode = MODE_POINT;

                            break;

 

                   case 4:

                            bEdgeFlag = TRUE;

                            break;

 

                   case 5:

                   default:

                            bEdgeFlag = FALSE;

                            break;

                   }

 

         glutPostRedisplay();

         }

 

 

// Begin the triangles

         glBegin(GL_TRIANGLES);

 

                   glEdgeFlag(bEdgeFlag);

                   glVertex2f(-20.0f, 0.0f);

                   glEdgeFlag(TRUE);

                   glVertex2f(20.0f, 0.0f);

                   glVertex2f(0.0f, 40.0f);

 

                   glVertex2f(-20.0f,0.0f);

                   glVertex2f(-60.0f,-20.0f);

                   glEdgeFlag(bEdgeFlag);

                   glVertex2f(-20.0f,-40.0f);

                   glEdgeFlag(TRUE);

 

                   glVertex2f(-20.0f,-40.0f);

                   glVertex2f(0.0f, -80.0f);

                   glEdgeFlag(bEdgeFlag);

                   glVertex2f(20.0f, -40.0f);         

                   glEdgeFlag(TRUE);

 

                   glVertex2f(20.0f, -40.0f);         

                   glVertex2f(60.0f, -20.0f);

                   glEdgeFlag(bEdgeFlag);

                   glVertex2f(20.0f, 0.0f);

                   glEdgeFlag(TRUE);

 

                   // Center square as two triangles

                   glEdgeFlag(bEdgeFlag);

                   glVertex2f(-20.0f, 0.0f);

                   glVertex2f(-20.0f,-40.0f);

                   glVertex2f(20.0f, 0.0f);

                  

                   glVertex2f(-20.0f,-40.0f);

                   glVertex2f(20.0f, -40.0f);

                   glVertex2f(20.0f, 0.0f);

                   glEdgeFlag(TRUE);

        

         // Done drawing Triangles

         glEnd();

 

 

 

设置定时器

void Timer(int value)

{

         glutTimerFunc(50,Timer, 0);

         glutPostRedisplay();

}

 

int main(int argc, char* argv[])

{

         glutInit(&argc, argv);

         glutInitDisplayMode(GLUT_RGB);

         glutInitWindowSize(800,600);

         glutCreateWindow("OpenGL Single Buffered");

         glutReshapeFunc(ChangeSize);

         glutDisplayFunc(RenderScene);

         glutTimerFunc(50,Timer, 0);

         glutMainLoop();

 

         return 0;

}

 

 

裁剪测试

glEnable(GL_SCISSOR_TEST);或者gldisable(GL_SCISSOR_TEST);

 

void glScissor(GLint  x, GLint  y, GLsizei  width, Glsizei  height);

 

模板测试

glEnable(GL_STENCIL_TEST);或者gldisable(GL_STENCIL_TEST);

 

void glStencilFunc(GLenum  func, GLint  ref, GLuint mask);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值