码迷,mamicode.com
首页 > 其他好文 > 详细

opemgl(四)

时间:2015-05-24 13:01:24      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

之前点或者线的大小是固定的为一个像素,然而我们可以通过一些方法改变。(昨天有些小问题我修改了一下)

如果是改变点的话就可以使用glPointSize()里面的参数是大小。

    #include <GL/glut.h>  
    void Display()  
    {  
      
        glClear(GL_COLOR_BUFFER_BIT);  
      
        glPointSize(30.0f);  
      
        glBegin(GL_POINTS);  
      
        glVertex2f(-0.5f, -0.5f);  
      
        glVertex2f(0.5f, 0.5f);  
      
        glEnd();  
      
        glFlush();  
      
    }  
      
    int main(int argc, char *argv[])  
      
    {  
      
        glutInit(&argc, argv);  
      
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
      
        glutInitWindowPosition(200, 200);  
      
        glutInitWindowSize(400, 400);  
      
        glutCreateWindow("第一个OpenGL程序");  
      
        glutDisplayFunc(&Display);  
      
        glutMainLoop();  
      
        return 0;  
      
    }  


技术分享那么这个点就会变成很多像素组成的了。


直线同理,使用glLineWidth()这个就可以了。


直线还可以进行话虚线的处理。

首先应该启动画虚线的模式glEnable(GL_LINE_STIPPLE);

在使用函数:void glLineStipple(GLint factor, GLushort pattern);//先来介绍第二个参数,第二个是二进制的16的序列,Ox3F07(二进制形式为0011111100000111),它所画出来的直线是这样的:先连续绘制3个像素,然后连续5个像素留空,再连续绘制6个像素,最后两个像素留空(注意,首先是从低位开始的)。


代码是这样的:

    #include <GL/glut.h>  
    void Display()  
    {  
      
        glClear(GL_COLOR_BUFFER_BIT);  
      
        glEnable(GL_LINE_STIPPLE);  
      
        glLineStipple(2, 0x0F0F);  
      
        glLineWidth(10.0f);  
      
        glBegin(GL_LINES);  
      
        glVertex2f(0.0f, 0.0f);  
      
        glVertex2f(0.5f, 0.5f);  
      
        glEnd();  
      
        glFlush();  
      
    }  
      
    int main(int argc, char *argv[])  
      
    {  
      
        glutInit(&argc, argv);  
      
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
      
        glutInitWindowPosition(200, 200);  
      
        glutInitWindowSize(400, 400);  
      
        glutCreateWindow("第一个OpenGL程序");  
      
        glutDisplayFunc(&Display);  
      
        glutMainLoop();  
      
        return 0;  
      
    }  



技术分享效果是这样的,因为我选择的模式是0101010101010101的。所以显示出来的就是这样的。



现在来说多边形,一般的多边形是有两种面的,正面和反面每个面可以选择不同的方式来绘制,填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。

需要使用原型是:void glPolygonMode(GLenum face,GLenum mode);来确定怎么绘制。

face这个参数确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的绘图模式:
GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)
GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)
GL_FRONT_AND_BACK表示显示模式将适用于物体的所有面
mode这个参数确定选中的物体的面以何种方式显示(显示模式):
GL_POINT表示显示顶点,多边形用点显示
GL_LINE表示显示线段,多边形用轮廓显示
GL_FILL表示显示面,多边形采用填充形式
这是参数,可以选择喜欢的(但是在高版本中只接受GL_FRONT_AND_BACK作为face的值)。

(二)

一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。

多边形的正反面可以通过void glFrontFace(GLenum mode);来改变(和绘图时的方向有关)

作用是控制多边形的正面是如何决定的。在默认情况下,mode是GL_CCW。
mode的值为:
GL_CCW 表示窗口坐标上投影多边形的顶点顺序为逆时针方向的表面为正面。
GL_CW 表示顶点顺序为顺时针方向的表面为正面。

    #include <GL/glut.h>  
    void Display()  
    {  
      
        glClear(GL_COLOR_BUFFER_BIT);  
      
        glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式  
      
        glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式  
      
        glFrontFace(GL_CCW);               // 设置逆时针方向为正面  
      
        glBegin(GL_POLYGON);                 
      
        glVertex2f(-0.5f, -0.5f);  
      
        glVertex2f(0.0f, -0.5f);  
      
        glVertex2f(0.0f, 0.0f);  
      
        glVertex2f(-0.5f, 0.0f);  
      
        glEnd();  
      
        glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方  
      
        glVertex2f(0.0f, 0.0f);  
      
        glVertex2f(0.0f, 0.5f);  
      
        glVertex2f(0.5f, 0.5f);  
      
        glVertex2f(0.5f, 0.0f);  
      
        glEnd();  
      
        glFlush();  
      
    }  
      
    int main(int argc, char *argv[])  
      
    {  
      
        glutInit(&argc, argv);  
      
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
      
        glutInitWindowPosition(200, 200);  
      
        glutInitWindowSize(400, 400);  
      
        glutCreateWindow("第一个OpenGL程序");  
      
        glutDisplayFunc(&Display);  
      
        glutMainLoop();  
      
        return 0;  
      
    }  




技术分享


(三)

在空间中,可以把不可见的多边形表面提出

glEnable(GL_CULL_FACE)先要启动模式,然后使用函数glCullFace()来提出

glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。

(四)

和线段一样,多变型也可以镂空的。glEnable(GL_POLYGON_STIPPLE)来启动怎么镂空。

然后使用void glPolygonStipple(const GLubyte *mask);来进行镂空。

其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。

这是代码:

    #include <GL/glut.h>  
    #include<stdio.h>  
    #include<stdlib.h>  
    void Display()  
    {  
      
        static GLubyte Mask[128];  
      
        FILE *fp;  
      
        fp = fopen("C:/Users/Administrator/Pictures/mask.bmp", "rb");  
      
        if (!fp)  
      
            exit(0);  
      
        if (fseek(fp, -(int)sizeof(Mask), SEEK_END))//把文件指到第一个字节的位置  
      
            exit(0);  
      
        if (!fread(Mask, sizeof(Mask), 1, fp))//开始把读到的放在mask的内存区域中  
      
            exit(0);  
      
        fclose(fp);  
      
        glClear(GL_COLOR_BUFFER_BIT);  
      
        glEnable(GL_POLYGON_STIPPLE);  
      
        glPolygonStipple(Mask);  
      
        glRectf(-0.5f, -0.5f, 0.0f, 0.0f);   // 在左下方绘制一个有镂空效果的正方形  
      
        glDisable(GL_POLYGON_STIPPLE);  
      
        glRectf(0.0f, 0.0f, 0.5f, 0.5f);     // 在右上方绘制一个无镂空效果的正方形  
      
        glFlush();  
    }  
      
    int main(int argc, char *argv[])  
      
    {  
      
        glutInit(&argc, argv);  
      
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
      
        glutInitWindowPosition(200, 200);  
      
        glutInitWindowSize(400, 400);  
      
        glutCreateWindow("第一个OpenGL程序");  
      
        glutDisplayFunc(&Display);  
      
        glutMainLoop();  
      
        return 0;  
      
    }  



技术分享(不要在意内容)黑色的是镂空的,白色的是不镂空的。

opemgl(四)

标签:

原文地址:http://blog.csdn.net/yj1499945/article/details/45950831

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!