如何在OpenGL中裁剪圆

如何在OpenGL中裁剪圆,opengl,buffer,geometry,clipping,Opengl,Buffer,Geometry,Clipping,我想知道是否有可能在OpenGL中模拟通过锁孔查看的效果 我画了我的3D场景,但我想把所有东西都变成黑色,除了一个中心圆 我尝试了这个解决方案,但它与我想要的完全相反: // here i draw my 3D scene // Begin 2D orthographic mode glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); GLint viewport [4]; glGetIntegerv(GL_VIEWP

我想知道是否有可能在OpenGL中模拟通过锁孔查看的效果

我画了我的3D场景,但我想把所有东西都变成黑色,除了一个中心圆

我尝试了这个解决方案,但它与我想要的完全相反:

// here i draw my 3D scene 

// Begin 2D orthographic mode
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

GLint viewport [4];
glGetIntegerv(GL_VIEWPORT, viewport);

gluOrtho2D(0, viewport[2], viewport[3], 0);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

// Here I draw a circle in the center of the screen
float radius=50;
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x, y);
for( int n = 0; n <= 100; ++n )
{
    float const t = 2*M_PI*(float)n/(float)100;
    glVertex2f(x + sin(t)*r, y + cos(t)*r);
}
glEnd();

// end orthographic 2D mode
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
//这里我画了我的3D场景
//开始二维正交模式
glMatrixMode(GL_投影);
glPushMatrix();
glLoadIdentity();
闪烁视口[4];
glGetIntegerv(GL_视口,视口);
gluOrtho2D(0,视口[2],视口[3],0);
glMatrixMode(GLU模型视图);
glPushMatrix();
glLoadIdentity();
//我在屏幕中央画了一个圆圈
浮动半径=50;
glBegin(GLU三角形风扇);
glVertex2f(x,y);

对于(int n=0;n来说,就像OpenGL中的其他所有东西一样,有几种方法可以做到这一点

使用圆形纹理:(推荐)

  • 画场景
  • 切换到正交投影,并使用中心有一个白色圆圈的纹理在整个屏幕上绘制一个四边形。使用适当的混合功能:

    glEnable(GL_BLEND);
    glBlendFunc(GL_ZERO, GL_SRC_COLOR);
    /* Draw a full-screen quad with a white circle at the center */
    
  • 或者,可以使用像素着色器生成圆形

    使用模具测试:(不建议使用,但如果没有纹理或着色器,可能会更容易)

  • 清除模具缓冲区,并在其中绘制圆

    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 1, 1);
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    /* draw circle */
    
  • 为场景的其余部分启用模具测试

    glEnable(GL_STENCIL_TEST)
    glStencilFunc(GL_EQUAL, 1, 1);
    glStencileOp(GL_KEEP, GL_KEEP, GL_KEEP);
    /* Draw the scene */
    

  • 脚注:我建议避免在代码中的任何时候使用立即模式,而是使用数组。这将提高代码的兼容性、可维护性、可读性和性能,这在所有领域都是一个胜利。

    我解决了第二种方法……这是我需要的资源:我不明白你的意思“即时模式",你是说使用glVertex2f和其他原语吗?是的,
    glVertex2f
    和它的朋友是即时模式。我强烈建议使用
    GLVERTExpinter
    /
    glDrawArrays
    /
    GLDRAWRANGELEMENTS
    等。相反,把
    glVertex2f
    想象成一个远古时代的遗迹,想想
    glVertexPointer
    被称为“老办法”(但没有老办法)。