OpenGL学习二--基础知识

来源:互联网 发布:部落冲突巨人升级数据 编辑:程序博客网 时间:2024/06/08 06:23

名称解释:

渲染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