【问题标题】:How to clip with circles in OpenGL如何在 OpenGL 中用圆圈进行剪辑
【发布时间】:2012-03-11 14:09:40
【问题描述】:

我想知道是否可以在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();

我得到的是在中心画的一个圆圈,但我想获得它的互补......

【问题讨论】:

    标签: opengl buffer geometry clipping


    【解决方案1】:

    与 OpenGL 中的其他所有内容一样,有几种方法可以做到这一点。这是我最想不到的两个。

    使用圆形纹理:(推荐)

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

      glEnable(GL_BLEND);
      glBlendFunc(GL_ZERO, GL_SRC_COLOR);
      /* Draw a full-screen quad with a white circle at the center */
      

    或者,您可以使用像素着色器来生成圆形。

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

    1. 清除模板缓冲区,并在其中绘制圆圈。

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

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

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

    【讨论】:

    • 我解决了第二种方法...这是我需要的资源:@​​987654321@我不明白你的“立即模式”是什么意思,你的意思是使用glVertex2f和其他原语?
    • 是的,glVertex2f 和它的朋友都是即时模式。我强烈建议改用glVertexPointer / glDrawArrays / glDrawRangeElements 等。将glVertex2f 视为过去时代的古老遗物,将glVertexPointer 视为“旧方式”(但不那么古老)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多