标签:
之前点或者线的大小是固定的为一个像素,然而我们可以通过一些方法改变。(昨天有些小问题我修改了一下)
如果是改变点的话就可以使用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;
}
现在来说多边形,一般的多边形是有两种面的,正面和反面每个面可以选择不同的方式来绘制,填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。
需要使用原型是:void glPolygonMode(GLenum face,GLenum mode);来确定怎么绘制。
(二)
一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。
多边形的正反面可以通过void glFrontFace(GLenum mode);来改变(和绘图时的方向有关)
#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;
}
标签:
原文地址:http://blog.csdn.net/yj1499945/article/details/45950831