精华内容
下载资源
问答
  • OpengL裁剪

    千次阅读 2014-06-09 10:47:29
    OpenGL中,裁剪用到glScissor:

    在OpenGL中,裁剪用到glScissor:

    void glScissor(
      GLint x,
      GLint y,
      GLsizei width,
      GLsizei height
    );

    Parameters
    x, y
    The lower-left corner of the scissor box. Initially (0,0).
    width, height
    The width and height of the scissor box. When an OpenGL context is first attached to a window, width and height are set to the dimensions of that window.
    Remarks
    The glScissor function defines a rectangle, called the scissor box, in window coordinates. The first two parameters, x and y, specify the lower-left corner of the box. The width and height parameters specify the width and height of the box.
    The scissor test is enabled and disabled using glEnable and glDisable with argument GL_SCISSOR_TEST. While the scissor test is enabled, only pixels that lie within the scissor box can be modified by drawing commands. Window coordinates have integer values at the shared corners of framebuffer pixels, so glScissor(0,0,1,1) allows only the lower-left pixel in the window to be modified, and glScissor(0,0,0,0) disallows modification to all pixels in the window.
    When the scissor test is disabled, it is as though the scissor box includes the entire window.
    The following functions retrieve information related to glScissor:
    glGet with argument GL_SCISSOR_BOX
    glIsEnabled with argument GL_SCISSOR_TEST

    例子:

    void CShape3D::drawTriangle(void) {
        glClear(GL_COLOR_BUFFER_BIT);
        glLineWidth(2.0f);
        glBegin(GL_TRIANGLE_STRIP);
            glColor3f(0.0f, 1.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            glVertex3fv(vTanglePoint[0]);
            glVertex3fv(vTanglePoint[1]);
            glVertex3fv(vTanglePoint[2]);
            glVertex3fv(vTanglePoint[3]);
        glEnd();
    
        glEnable(GL_SCISSOR_TEST);  
        glScissor(0,400 / 4, 400, 400 / 2);  
        glClear(GL_COLOR_BUFFER_BIT);  
        
        glFlush();
        glDisable(GL_SCISSOR_TEST);
        glutSwapBuffers();
    }

    cocos2dx的遮罩其实也可以利用这个来处理

    展开全文
  • OpenGL裁剪

    千次阅读 2015-08-21 09:22:40
    裁剪是将OpenGL渲染限制在窗口中的一个特定的矩形区域中,这样可以渲染的时候只刷新屏幕上的一部分

    裁剪是将OpenGL渲染限制在窗口中的一个特定的矩形区域中,这样可以渲染的时候只刷新屏幕上的一部分

    我们来看一下效果 如下图



    我们新建一个工程,工程的创建我们在第一节讲过了

     来看一下需要包含的文件

    #include <GLTools.h>        
    #define FREEGLUT_STATIC
    #include <GL/glut.h>

    下面是主函数

    int main(int argc, char* argv[])
    	{
    		//初始化GLUT库
    		glutInit(&argc, argv);
    		//双缓冲模式就是图形先渲染到后台缓冲区,然后再调用glutSwapBuffers()一起渲染到前台缓冲区
    		glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    		//要创建的窗口大小
    		glutInitWindowSize(800,600);
    		//要创建的窗口标题
    		glutCreateWindow("OpenGL Scissor");
    		//窗口大小改变时的回调函数
    		glutReshapeFunc(ChangeSize);
    		//渲染的回调函数
    		glutDisplayFunc(RenderScene);
    		//开始主消息循环 
    		glutMainLoop();
    
    		return 0;
    	}


    下面是窗口改变时的函数

    void ChangeSize(int w, int h)
    	{
    		if (h == 0)
    			h = 1;
    		//设置视口大小
    		glViewport(0, 0, w, h);
    	}

    下面是最后一个函数RenderScene(void) 

    我们先在窗口的x=100,y=100的地方绘制一个长和宽都是100的蓝色矩形

    代码如下

    void RenderScene(void)
    	{
    		//使下一次渲染时窗口颜色为蓝色
    		glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
    		//裁剪的区域
    		glScissor(100, 100, 100, 100);
    		//开启裁剪测试
    		glEnable(GL_SCISSOR_TEST);
    		//清除颜色缓冲区 就是将屏幕上最后绘制的内容删除
    		glClear(GL_COLOR_BUFFER_BIT);
    		//交换缓冲区
    		glutSwapBuffers();
    	}

    效果图如下


    其中glScissor(100, 100, 100, 100);就是来设置裁剪区域的,我们还需要通过glEnable(GL_SCISSOR_TEST) 来开启裁剪测试

    在RenderScene函数中加入下面的代码 来绘制第二个矩形

                    //使下一次渲染时窗口颜色为绿色
    		glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
    		//裁剪的区域
    		glScissor(300, 300, 100, 100);
    		//清除颜色缓冲区
    		glClear(GL_COLOR_BUFFER_BIT);
    
    		//禁用裁剪测试
    		glDisable(GL_SCISSOR_TEST);

    这样就是文章开始时的效果了





    展开全文
  • opengl裁剪算法代码

    2018-12-27 14:08:06
    vs实现的opengl裁剪算法,课程实验,可以实现。
  • opengl裁剪算法

    2015-10-21 13:23:23
    OpenGL的经典裁剪算法,经过亲自验证,运行无问题
  • OPenGL 裁剪窗口

    2016-06-10 13:58:00
    1 /************************************************************* ... 2 裁剪窗口 3 4 *************************************************************/ 5 6 7 #include <GL/glut...
      1 /*************************************************************
      2      裁剪窗口
      3      
      4 *************************************************************/
      5 
      6 
      7 #include <GL/glut.h>
      8 #include<cstdio>
      9 #include<cmath>
     10 
     11 #define ymin -300
     12 #define ymax 300
     13 #define xmin -400
     14 #define xmax 400
     15 
     16 struct point 
     17 {
     18     int x;
     19     int y;
     20 };
     21 
     22 typedef enum
     23 {
     24     L,R,B,T
     25 }BD;
     26 
     27 point s,e;
     28 point in[100],out[100];
     29 int len=0;
     30 
     31 
     32 void init()
     33 {
     34     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //什么单缓存的东西,现在不懂什么意思,就当通用条件
     35     glutInitWindowPosition(0, 0);                                //图片出现的位置
     36     glutInitWindowSize(400, 300);                                //图片的长和宽
     37     glutCreateWindow("pb-图形学题1");                            //图片的名字
     38 
     39     glClearColor(0.0, 0.0, 0.0, 0.0);
     40     glMatrixMode(GL_PROJECTION);
     41     gluOrtho2D(-1000, 1000, -1000, 1000); 
     42 
     43     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
     44     glClear(GL_COLOR_BUFFER_BIT);
     45     glColor3f(1.0, 0.0, 0.0);  
     46     
     47     printf("请输入裁剪直线的起点和终点:\n");
     48     scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
     49     if (s.x>e.x)
     50     {
     51         point temp;
     52         temp=s;
     53         s=e;
     54         e=temp;
     55     }
     56     printf("请输入多边形的端点");
     57     while (~scanf("%d%d",&in[len].x,&in[len++].y));
     58     len--;
     59     in[len]=in[0];
     60 
     61 }
     62 
     63 
     64 void setPixel (GLint x,GLint y,GLint nx,GLint ny)               //描点函数,表示从x,y到nx,ny的矩形全部涂色
     65 {
     66     glBegin(GL_LINES);
     67        glVertex2i(x, y);
     68        glVertex2i(nx,ny);
     69     glEnd();
     70 }
     71 
     72 bool insert(point s,BD b)                                //判断短知否在边界内
     73 {
     74     switch(b)
     75     {
     76         case L:
     77             if (s.x<=xmin) return false;
     78             break;
     79         case R:
     80             if (s.x>=xmax) return false;
     81             break;
     82         case B:
     83             if (s.y<=ymin) return false;
     84             break;
     85         case T:
     86             if (s.y>=ymax) return false;
     87             break;
     88     }
     89     return true;
     90 }
     91 
     92 point check(point s,point e,BD b)                                    //  计算直线与边界的交点
     93 {
     94     point pi;
     95     int k;
     96     switch(b)
     97     {
     98         case L:
     99            pi.x=xmin;
    100            if (s.x!=e.x) pi.y=s.y+(xmin-s.x)*(e.y-s.y)/(e.x-s.x);
    101            else pi.y=s.y;
    102            break;
    103         case R:
    104             pi.x=xmax;
    105             if (s.x!=e.x) pi.y=s.y-(s.x-xmax)*(e.y-s.y)/(e.x-s.x);
    106             else pi.y=s.y;
    107             break;
    108         case B:
    109             pi.y=ymin;
    110             if (e.y!=s.y) pi.x=s.x+(e.x-s.x)*(ymin-s.y)/(e.y-s.y);
    111             else pi.x=s.x;
    112             break;
    113         case T:
    114             pi.y=ymax;
    115             if (e.y!=s.y) pi.x=s.x-(e.x-s.x)*(s.y-ymax)/(e.y-s.y);
    116             else pi.x=s.x;
    117             break;
    118     }
    119     return pi;
    120 }
    121 
    122 int EC(BD b)                                                //多边形裁剪
    123 {
    124     int pl=0;
    125     point s=in[0];
    126     for (int i=1;i<=len;i++)
    127     {
    128         if (!insert(s,b)&&insert(in[i],b))
    129         {
    130              out[pl++]=check(s,in[i],b);
    131              out[pl++]=in[i];
    132         }
    133         if (insert(s,b)&&insert(in[i],b))
    134         {
    135             out[pl++]=in[i];
    136         }
    137         if (insert(s,b)&&!insert(in[i],b))
    138         {
    139             out[pl++]=check(in[i],s,b);
    140         }
    141         s=in[i];
    142     }
    143     return pl;
    144 }
    145 
    146 
    147 bool LinTai(point &s,point &e)                 //线裁剪
    148 {
    149 
    150     //上裁剪
    151     if (s.y>=ymax&&e.y>=ymax) return false;
    152     if (s.y>=ymax)
    153     {
    154          s.x+=(s.y-ymax)*(e.x-s.x)/(s.y-e.y);
    155          s.y=ymax;
    156     }
    157     if (e.y>=ymax)
    158     {
    159         e.x-=(e.y-ymax)*(e.x-s.x)/(e.y-s.y);
    160         e.y=ymax;
    161     }
    162 
    163     //下裁剪
    164     if (s.y<=ymin&&e.y<=ymin) return false;
    165     if (s.y<=ymin)
    166     {
    167           s.x+=(ymin-s.y)*(e.x-s.x)/(e.y-s.y);
    168           s.y=ymin;
    169     }
    170     if (e.y<=ymin)
    171     {
    172           e.x-=(ymin-e.y)*(e.x-s.x)/(s.y-e.y);
    173           e.y=ymin;
    174     }
    175 
    176     //右裁剪
    177     if (s.x>=xmax&&e.x>=xmax) return  false;
    178     if (e.x>=xmax)
    179     {
    180          e.y-=(e.x-xmax)*(e.y-s.y)/(e.x-s.x);
    181          e.x=xmax;
    182     }
    183 
    184     //左裁剪
    185     if (s.x<=xmin&&e.x<=xmin) return false;
    186     if (s.x<=xmin)
    187     {
    188         s.y+=(xmin-s.x)*(e.y-s.y)/(e.x-s.x);
    189         s.x=xmin;
    190     }
    191 
    192     return true;
    193 }
    194 
    195 void myDisplay()
    196 {
    197     glBegin(GL_POLYGON);
    198        glVertex2f(xmin,ymax);
    199        glVertex2f(xmax,ymax);
    200        glVertex2f(xmax,ymin);
    201        glVertex2f(xmin,ymin);
    202     glEnd();
    203     glFlush();
    204 
    205      point s1=s,e1=e;
    206     if (LinTai(s,e))
    207     {
    208 
    209 
    210         printf("%d %d %d %d\n",s1.x,s1.y,s.x,s.y);
    211 
    212           glColor3f(0.0, 0.0, 1.0);
    213           setPixel(s.x,s.y,s1.x,s1.y);
    214           setPixel(e.x,e.y,e1.x,e1.y);
    215 
    216           glColor3f(0.0, 1.0, 0.0);
    217           setPixel(s.x,s.y,e.x,e.y);
    218     }
    219     else
    220     {
    221         glColor3f(0.0, 0.0, 1.0);
    222         setPixel(s1.x,s1.y,e1.x,e1.y);
    223     }
    224 
    225     glFlush();
    226 
    227     int i,j;
    228     glColor3f(1.0, 0.0, 1.0); 
    229     glBegin(GL_LINE_LOOP);
    230     for (i=0;i<len;i++)
    231         glVertex2f(in[i].x,in[i].y);
    232     glEnd();
    233     glFlush();
    234     for (i=0;i<4;i++)
    235     { 
    236     
    237         len=EC(BD(i));
    238         for(j=0;j<len;j++) in[j]=out[j];
    239         in[len]=out[0];
    240 
    241     }
    242     glColor3f(1.0, 1.0, 0.0);
    243     glBegin(GL_LINE_LOOP);
    244     for (i=0;i<len;i++) 
    245       glVertex2f(in[i].x,in[i].y);
    246     glEnd();
    247 
    248     glFlush();
    249 }
    250 
    251  int main(int argc, char *argv[])
    252  {
    253      glutInit(&argc, argv);
    254      init();                                                     //初始化数据
    255      glutDisplayFunc(&myDisplay);                                //调用函数                    
    256      glutMainLoop();                                             //开始程序
    257      return 0; 
    258  }

     

    转载于:https://www.cnblogs.com/pblr/p/5573615.html

    展开全文
  • Qt OpenGL裁剪测试

    2019-03-01 17:51:00
    下面的代码将GLWidget绘图区域中进行四周边界处10像素的裁剪: // 启用剪裁测试 glEnable ( GL_SCISSOR_TEST ); // 裁剪区域 glScissor ( 10 , 10 ,  this -> geometry (). width () - ...

    剪裁测试(Scissor Test)用于限制绘制区域。

    我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。

    换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。

    可以通过下面的代码来启用或禁用剪裁测试:

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

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

    可以通过下面的代码来指定一个位置在(x, y),宽度为width,高度为height的剪裁窗口。glScissor(x, y, width, height);

    注意: glScissor窗口坐标是以左下角为(0, 0),右上角为(width, height)的,这与Windows系统窗口有所不同。

    下面的代码将GLWidget绘图区域中进行四周边界处10像素的裁剪:

    // 启用剪裁测试

    glEnable(GL_SCISSOR_TEST);

    // 裁剪区域

    glScissor(10, 10this->geometry().width()- 20,this->geometry().height()- 20);

    运行效果:

     

    Qt自带的boxes例程中,QtBox类可以显示一个旋转的漂亮立方体,但是在其旋转的过程中绘制区域会超出图形项Item的黄色边界,如下图所示:

    此时可以设置裁剪区,黄色边界内的绘制显示,边界外的则不绘制!

    在QtBox::paint中添加代码如下:

    //全局绘制区域的大小

    float width = float(painter->device()->width());

    float height = float(painter->device()->height());

    //全局绘制区域的大小

    glScissor(pos().x() - m_size / 2, height - m_size / 2 - pos().y(), m_size, m_size);

    glEnable(GL_SCISSOR_TEST);

    ……

    glDisable(GL_SCISSOR_TEST);

    其中,m_size为黄色正方形区域的大小,pos()获取在全局场景绘制区域中的图元中心坐标位置。

    修改后运行效果:

     

    转载于:https://www.cnblogs.com/MakeView660/p/10457905.html

    展开全文
  • opengl 裁剪平面

    2014-06-08 15:51:00
    原帖地址:... voidglClipPlane(GLenumplane,constGLdouble*equation); 定义一个裁剪平面。equation参数指向平面方程Ax + By + Cz + D = 0的4个系数。equation=(0,-1,0,0),前三...
  • 理解OpenGL 裁剪区域和视口

    千次阅读 2014-11-26 15:52:24
    看了好多文章,都不能真正的明白裁剪区域到底是什么。网上找了个例子 #include #include #include #include #include const float PI = 3.1415926; const int WINDOW_...
  • 最近做了一个类似捕鱼达人显示金币数字滚动的效果,在win32上正常,裁剪代码如下: void NumberScrollLabel::visit() { //启动遮罩效果 glEnable(GL_SCISSOR_TEST); CCPoint pos = CCPointZero; pos = visibleNode->...
  • opengles裁剪平面

    2016-10-28 13:39:17
    opengles裁剪平面
  • OpenGL多边形裁剪

    2012-12-07 20:28:10
    Sutherland—Hodgman OpenGL多边形裁剪 vc++ 6.0 环境下开发
  • OPENGL线段裁剪

    2018-05-14 14:17:11
    完成Liang-Barsky算法的代码,用算法解决以下问题并画出结果: 显示区域矩形由(2,3)和(8,4)围成求线段F1F2在矩形中裁剪后的部分。F1:(6,3),F2:(1,-2)
  • opengl 线段裁剪

    2009-04-11 11:17:54
    使用C语言版的OPENGL线段裁剪的算法,只是源程序,可以略加修改作为函数调用
  • opengl 图形学 直线和多边形裁剪 C++
  • OpenGL裁剪平面

    千次阅读 2015-06-01 20:25:37
    OpenGL中,除了视景体的6个裁剪面(左、右、顶、底、远和近)外,我们还可以指定最多6个裁剪面。 我们知道,一个平面,它是由Ax+By+Cz+D = 0这个三元一次函数构成。是怎么样一个平面,就由这个函数的系数决定。 ...
  • OpenGL.裁剪算法

    千次阅读 2016-06-06 21:08:03
    裁剪就是来确定 哪些是位于视景体内,应当被最后成图来考虑的 哪些是位于视景体外,不需要后续的处理了(因为不属于成图范围嘛) 线段的裁剪算法 Cohen-Sutherlend算法 这是一种很巧妙的裁剪算法,运用了编码的...
  • //Liang-Barsky 线段裁剪算法 class wcPt2D { public: GLfloat x,y; public: /* Default Constructor:initalize position 48(0.0,0.0).*/ wcPt2D(){ x=y=0.0; } wcPt2D(GLfloat nx, GLfloat ny): x(nx), y...
  • OpenGL中提⾼渲染的⼀种方式:只刷新屏幕上发生变化的部分,OpenGL 允许将要进⾏行渲染的窗⼝只去指定⼀个裁剪框; 基本原理:⽤于渲染时限制绘制区域,通过此技术可以再屏幕(帧缓冲)指定一个矩形区域。启用剪裁...
  • OpenGL使用裁剪平面

    千次阅读 2013-08-21 20:46:04
    1.不适用裁剪平面 // VAO.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #include #pragma comment(lib, "glut32.lib") #pragma comment(lib, "glew32.l
  • opengl实现直线裁剪

    热门讨论 2012-10-16 11:56:22
    下面的程序段在windows控制台下实现按住鼠标右键绘制一个矩形,按住鼠标左键,绘制直线段,并利用Cohen-Sutherland算法实现直线裁剪
  • openGL图形变换和裁剪

    2013-10-21 19:53:46
    openGL图形变换和裁剪,矩阵的使用以及基本的用法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 779
精华内容 311
关键字:

opengl裁剪