zoukankan      html  css  js  c++  java
  • 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();      
    }  


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




  • 相关阅读:
    Java 实现 蓝桥杯 生兔子问题
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 蓝桥杯 基因牛的繁殖
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    Java实现 LeetCode 33 搜索旋转排序数组
    深入探究VC —— 资源编译器rc.exe(3)
    深入探究VC —— 编译器cl.exe(2)
    深入探究VC —— 编译器cl.exe(1)
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411909.html
Copyright © 2011-2022 走看看