之前点或者线的大小是固定的为一个像素,然而我们可以通过一些方法改变。(昨天有些小问题我修改了一下)
如果是改变点的话就可以使用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; }
(不要在意内容)黑色的是镂空的,白色的是不镂空的。