• OpenGL(十八) 顶点数组和抗锯齿(反走样)设置



    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用。使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERTEX_ARRAY(顶点数据)和GL_COLOR_ARRAY(颜色数组),颜色数组可以为每个顶点分别分配颜色。


    glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

    第一个参数size,代表顶点数组中数据的维度,只能是2,3或4,即二维、三维、四维;

    第二个参数type,代表顶点数组中每个数据的类型,如GL_INT,GL_FLOAT;

    第三个参数stride,代表连续顶点之间的字节偏移量,经常使用一个int型常量乘以sizeof(int/float)来表示;

    第四个参数pointer,指向数组数据的起始位置;


    glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)

    第一个参数mode指定用顶点数组创建的图元的类型;

    第二个参数count,代表整个图元包含的顶点数;

    第三个参数type,是顶点数组序列数据的类型,GL_UNSIGNED_BYTE或GL_UNSIGNED_INT;

    第四个参数indices,顶点数组序列数据的起始位置;


    glDrawArrays (GLenum mode, GLint first, GLsizei count);


    第一个参数mode指定用顶点数组创建的图元的类型;

    第二个参数first指定从顶点数组内起始的位置偏移量;

    第三个参数count指定顶点数量;


    用顶点数组绘制立方体的三个面:

    #include <glut.h> 
    
    GLsizei windowWidth=400,windowHeight=400;
    GLfloat data[]={-10,-10,10,1,0,0,
    	10,-10,10,0,1,0,
    	10,10,10,0,0,1,
    	-10,10,10,1,1,0,
    	-10,-10,-10,1,0,1,
    	10,-10,-10,0,1,1,
    	10,10,-10,1,1,1};
    GLubyte index[]={0,1,2,3,4,5,1,0,2,1,5,6};
    
    void Init()
    {
    	glEnable(GL_DEPTH_TEST);  
    	glMatrixMode(GL_PROJECTION);  
    	glLoadIdentity();  
    	gluPerspective(75,1,1,50);  
    	glMatrixMode(GL_MODELVIEW);  
    	glLoadIdentity();  
    	gluLookAt(20,-20,30,0,0,0,0,1,0);   
    }
    
    void Display()
    {
    	glClearColor(1,1,1,1);
    	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    	glEnableClientState(GL_VERTEX_ARRAY);
    	glEnableClientState(GL_COLOR_ARRAY);
    	glColorPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[3]);
    	glVertexPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[0]);
    	//glDrawArrays(GL_QUADS,0,8);
    	glDrawElements(GL_QUADS,12,GL_UNSIGNED_BYTE,index);
    	glutSwapBuffers();
    }
    
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(windowWidth, windowHeight);    
    	glutCreateWindow("OpenGL");
    	Init();
    	glutDisplayFunc(&Display);   //回调函数 	
    	glutMainLoop();      
    }  




    光栅是一个一个离散的单元,在显示的时候具有锯齿形或阶梯状外观,这种由于低频取样(不充分取样)导致的信息失真的情况称为走样,OpenGL中可以对走样进行校正。

    对于点的反锯齿校正使用glEnable(GL_POINT_SMOOTH)启用对点的锯齿校正,glHint (GL_POINT_SMOOTH, GL_NICEST)函数来进行校正。

    glHint函数的第一个参数是校正的图元类型:

    1. GL_POINT_SMOOTH 点
    2. GL_LINE_SMOOTH 线
    3. GL_POLYGON_SMOOTH 多边形

    第二个参数是对校正效果的设定:

    1. GL_DONT_CARE  不校正
    2. GL_FASTEST  优先考虑处理速度
    3. GL_NICEST     优先考虑显示质量

    #include <glut.h> 
    
    GLsizei windowWidth=400,windowHeight=400;
    
    void Init()
    { 
    	glMatrixMode(GL_MODELVIEW);  
    	glLoadIdentity();  
    	gluOrtho2D(0,400,0,400);
    }
    
    void Display()
    {
    	glClearColor(1,1,1,1);
    	glClear(GL_COLOR_BUFFER_BIT);
    	glColor3f(0,0,1);
    	glPointSize(10);
    
    	glBegin(GL_POINTS);
    	glVertex2f(100,300);
    	glEnd();
    
    	glEnable(GL_POINT_SMOOTH);
    	glHint(GL_POINT_SMOOTH,GL_NICEST);
    
    	glBegin(GL_POINTS);
    	glVertex2f(130,300);
    	glEnd();
    	glDisable(GL_POINT_SMOOTH);
    
    	glColor3f(1,0,0);
    	glLineWidth(10);
    
    	glBegin(GL_LINES);
    	glVertex2f(80,120);
    	glVertex2f(280,320);	
    	glEnd();
    
    	glEnable(GL_LINE_SMOOTH);
    	glHint(GL_LINE_SMOOTH,GL_FASTEST);
    
    	glBegin(GL_LINES);
    	glVertex2f(80,80);
    	glVertex2f(280,280);
    	glEnd();
    
    	glDisable(GL_LINE_SMOOTH);
    
    	glFlush();
    }
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(windowWidth, windowHeight);    
    	glutCreateWindow("OpenGL");
    	Init();
    	glutDisplayFunc(&Display);   //回调函数 	
    	glutMainLoop();      
    }  


    左侧是没有经过反走样校正的点和线,右侧经过校正:




  • 相关阅读:
    div 背景透明,字体不透明
    弹性盒子(1)
    小练习(4)
    小练习(3)
    图标文字上拉效果
    小练习(2)
    小练习
    css的使用(1)
    复合的使用
    表单元素的使用 form input
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411909.html
Copyright © 2020-2023  润新知