剪裁测试用于限制绘制区域。我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。有的朋友可能玩过《魔兽争霸3》这款游戏。游戏时如果选中一个士兵,则画面下方的一个方框内就会出现该士兵的头像。为了保证该头像无论如何绘制都不会越界而覆盖到外面的像素,就可以使用剪裁测试。可以通过下面的代码来启用或禁用剪裁测试:

glEnable(GL_SCISSOR_TEST);   // 启用剪裁测试
glDisable(GL_SCISSOR_TEST); // 禁用剪裁测试

可以通过下面的代码来指定一个位置在(x, y),宽度为width,高度为height的剪裁窗口。glScissor(x, y, width, height);注意,glScissor窗口坐标是以左下角为(0, 0),右上角为(width, height)的,这与Windows系统窗口有所不同。

Demo使用裁剪区来将矩形窗口正中间四分之一刷成红色,正中间十六分之一刷成绿色。

源代码:

// GlutScissorDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <gl/glut.h>
#include <math.h>
//圆周率宏
#define GL_PI 3.1415f
//获取屏幕的宽度
GLint SCREEN_WIDTH=0;
GLint SCREEN_HEIGHT=0;
//设置程序的窗口大小
GLint windowWidth=400;
GLint windowHeight=300;
//绕x轴旋转角度
GLfloat xRotAngle=0.0f;
//绕y轴旋转角度
GLfloat yRotAngle=0.0f;
//受支持的点大小范围
GLfloat sizes[2];
//受支持的点大小增量
GLfloat step;
//显示回调函数
void renderScreen(void){GLfloat x,y,z,angle;int i;// Clear blue windowglClearColor(0.0f, 0.0f, 1.0f, 0.0f);//把整个窗口清理为当前清理颜色:蓝色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将当前Matrix状态入栈glPushMatrix();//坐标系绕x轴旋转xRotAngleglRotatef(xRotAngle,1.0f,0.0f,0.0f);//坐标系绕y轴旋转yRotAngleglRotatef(yRotAngle,0.0f,1.0f,0.0f);x=0.0f;y=0.0f;z=0.0f;//进行平滑处理 glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH,GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH,GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glHint(GL_POLYGON_SMOOTH,GL_NICEST);//绘制坐标系glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINES);glVertex3f(-80.0f,0.0f,0.0f);glVertex3f(80.0f,0.0f,0.0f);glVertex3f(0.0f,-80.0f,0.0f);glVertex3f(0.0f,80.0f,0.0f);glVertex3f(0.0f,0.0f,-80.0f);glVertex3f(0.0f,0.0f,80.0f);glEnd();glPushMatrix();glTranslatef(80.0f,0.0f,0.0f);glRotatef(90.0f,0.0f,1.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,80.0f,0.0f);glRotatef(-90.0f,1.0f,0.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,0.0f,80.0f);glRotatef(90.0f,0.0f,0.0f,1.0f);glutWireCone(3,6,10,10);glPopMatrix();//使能裁剪区glEnable(GL_SCISSOR_TEST);//将窗口中间的四分之一面积清空为红色glClearColor(1.0f, 0.0f, 0.0f, 0.0f);glScissor(windowWidth/4,windowHeight/4, windowWidth/2,windowHeight/2);glClear(GL_COLOR_BUFFER_BIT);//将窗口中间的十六分之一面积清空为绿色glClearColor(0.0f, 1.0f, 0.0f, 0.0f);glScissor(windowWidth*3/8,windowHeight*3/8, windowWidth/4,windowHeight/4);glClear(GL_COLOR_BUFFER_BIT);//禁止裁剪区glDisable(GL_SCISSOR_TEST);//恢复压入栈的MatrixglPopMatrix();//交换两个缓冲区的指针glutSwapBuffers();
}
//设置Redering State
void setupRederingState(void){//设置清理颜色为黑色glClearColor(0.0f,0.0,0.0,1.0f);//设置绘画颜色为绿色glColor3f(0.0f,1.0f,0.0f);//使能深度测试glEnable(GL_DEPTH_TEST);//获取受支持的点大小范围glGetFloatv(GL_POINT_SIZE_RANGE,sizes);//获取受支持的点大小增量glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);printf("point size range:%f-%f\n",sizes[0],sizes[1]);printf("point step:%f\n",step);
}
//窗口大小变化回调函数
void changSize(GLint w,GLint h){//横宽比率GLfloat ratio;//设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)GLfloat coordinatesize=100.0f;//窗口宽高为零直接返回if((w==0)||(h==0))return;//设置视口和窗口大小一致glViewport(0,0,w,h);//对投影矩阵应用随后的矩阵操作glMatrixMode(GL_PROJECTION);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();ratio=(GLfloat)w/(GLfloat)h;//正交投影if(w<h)glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);elseglOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);//对模型视图矩阵堆栈应用随后的矩阵操作glMatrixMode(GL_MODELVIEW);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();
}//按键输入处理回调函数
void specialKey(int key,int x,int y){if(key==GLUT_KEY_UP){xRotAngle-=5.0f;}else if(key==GLUT_KEY_DOWN){xRotAngle+=5.0f;}else if(key==GLUT_KEY_LEFT){yRotAngle-=5.0f;}else if(key==GLUT_KEY_RIGHT){yRotAngle+=5.0f;}//重新绘制glutPostRedisplay();
}int main(int argc, char* argv[])
{int nModeMenu;int nEdgeMenu;int nDepthMask;int nMainMenu;//初始化glut glutInit(&argc,argv);//使用双缓冲区模式glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);//获取系统的宽像素SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);//获取系统的高像素SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);//创建窗口,窗口名字为OpenGL Scissor DemoglutCreateWindow("OpenGL Scissor Demo");//设置窗口大小glutReshapeWindow(windowWidth,windowHeight);//窗口居中显示glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);//窗口大小变化时的处理函数glutReshapeFunc(changSize);//设置显示回调函数 glutDisplayFunc(renderScreen);//设置按键输入处理回调函数glutSpecialFunc(specialKey);//设置全局渲染参数setupRederingState();glutMainLoop();return 0;
}

VS2012下基于Glut OpenGL glScissor示例程序:相关推荐

  1. VS2012下基于Glut OpenGL GL_STENCIL_TEST示例程序:

    模板测试是把像素存储在模板缓冲区的值与一个参考值进行比较.根据测试的结果,对模板缓冲区中得这个值进行相应的修改. Note:模板测试只有在存在模板缓冲区的情况下才会执行,如果不存在模板缓冲区,模板测试 ...

  2. VS2012下基于Glut OpenGL GL_QUADS示例程序:

    OpenGL 使用GL_QUADS绘制四边形示例程序,显示效果如下所示. GL_QUADS连续点生成四边形的规则如下图所示: 源代码如下: // GlutQuadsDemo.cpp : 定义控制台应用 ...

  3. VS2012下基于Glut OpenGL GL_POLYGON示例程序:

    很多书介绍GL_POLYGON连续点生成多边形时这下点必须是凸多边形的,规则如下图所示.写个Demo验证了下似乎不是凸多边形的也可以. Demo的正面与背面显示效果: 源代码如下所示: // Glut ...

  4. VS2012下基于Glut OpenGL glDepthMask示例程序:

    glDepthMask (GLboolean flag)函数可以决定将他之后的数据不写入深度缓冲区.当flag为GL_TRUE时之后的数据不写入深度缓冲区,即使启用了深度缓冲区测试功能. 使用上一个D ...

  5. VS2012下基于Glut OpenGL glEdgeFlag示例程序:

    glEdgeFlag (GLboolean flag)表示一个顶点是否应该被认为是多边形的一条边界边的起点.flag为GL_TRUE后面的点都被认为是边界上的点,flag为GL_FALSE则之后的点不 ...

  6. VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:

    直线可以被画成虚线,而多边形则可以进行镂空. 首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭 ...

  7. VS2012下基于Glut OpenGL GL_QUAD_STRIP示例程序:

    OpenGL连续点通过GL_QUAD_STRIP生成四边形规则如下图所示: 演示程序效果如下图所示: 源代码如下所示: // GlutQuadStripDemo.cpp : 定义控制台应用程序的入口点 ...

  8. VS2012下基于Glut glRotatef glTranslatef示例程序:

    Demo使用glRotatef ,glTranslatef来实现一个太阳.地球.月亮运动的3D图形. 1.glTranslatef() --模型变换函数移动 voidglTranslatef(GLfl ...

  9. VS2012下基于Glut 绘制立方体示例程序:

    使用glBegin(GL_QUADS)绘制六个侧面来组成一个立方体:并使用glFrontFace(GL_CW).glFrontFace(GL_CCW)来设置每个面的正面:使用glColor3ub来设置 ...

最新文章

  1. Mac OS X的快捷键
  2. 关于yum的/repodata/repomd.xml错误
  3. mysql 社区版 阿里云_Mysql各版本介绍及下载
  4. 字节跳动如何做教育? | 详解
  5. POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)
  6. LXC C API 使用
  7. 计算机基础ABCDEF,计算机应用基础_在线作业ABCDEF.docx
  8. php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结
  9. 如何安装redmine插件
  10. 前端Swiper滑动的时候最右一个反弹回去了
  11. paip.提升用户体验---网站程序HTML,JS需要注意的地方
  12. 如何使用patch命令打补丁
  13. theano java_Theano:调用Theano函数的论据
  14. 业余设计不求人,30秒AI快速制作LOGO
  15. Q6:QIA一站式测试
  16. C++Primer 第8章IO流
  17. 张寓博当选山东省收藏者协会副主席兼美术评论委员会主任
  18. 结构化数据,半结构化数据,非结构化数据非区别和示例
  19. 专题训练二 搜索进阶 HDU - 3085 Nightmare Ⅱ (双向BFS + 曼哈顿距离)
  20. c语言起点零算法32继续求多项式,武汉科技大学ACM :1001: 零起点学算法34——继续求多项式...

热门文章

  1. Petrozavodsk Summer-2016. Ural FU Dandelion Contest
  2. CEO换人、IPO延期,比特大陆艰难转型路漫漫
  3. IsomorphicStrings(leetcode205)
  4. Hexo+腾讯云COS,为你的站点加速
  5. react 项目实战(六)提取布局组件
  6. SQL语句技巧:查询时巧用OR实现逻辑判断
  7. JSP Tomcat8.0运行连接池时发生异常【AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z】...
  8. C# 真正能发邮件的源码
  9. 《游戏设计师修炼之道:数据驱动的游戏设计》一2.8小结
  10. heartbeat之part1