OPENGL 绘制带孔的形状(如多边形)(任何 2D 形状孔)
OPENGL draw shapes(like polygon) with holes (any 2D shapes hole)
我想在 OpenGL 和 GLFW3 中绘制带孔的形状。我怎样才能做到这一点?我不想使用 gluTessBeginPolygon
.
这是一个长方形,上面有一个长方形孔
如果形状总是一样的,那么最简单的方法就是改变你的形象化方式。它不是带孔的多边形,而是 2 个(或更多)没有孔的多边形。改为绘制:
但是,如果形状是动态变化的,那么在代码中计算这个三角剖分就很困难了。
如果因为孔形状是动态的而不能这样做,那么您可以使用模板缓冲区来防止 OpenGL 在孔所在的位置绘制。清除模板缓冲区,设置渲染模式,以便您只写入模板,然后渲染孔。然后将模式设置回正常但设置模板测试,这样它就不会在模板缓冲区不为零的地方绘制,并渲染矩形。然后恢复正常。
如果你有一个有很多洞的形状(比如 chain-link 栅栏)那么你应该使用带有 alpha 通道的纹理,而不是渲染无数的顶点,并使用 alpha在着色器中进行测试 - 在透明像素上使用 discard;
,这样它们就不会渲染。 fixed-function 的版本是 GL_ALPHA_TEST
。
如果你有检测一个像素点是否在洞中的公式,你也可以使用discard;
。您的着色器可以出于您喜欢的任何原因丢弃 - 它不必基于纹理的 alpha 通道。
您不能做的是计算从左到右移动时穿过多边形边界的次数,就像扫描线渲染器那样。这是因为 OpenGL 并行处理所有像素 - 而不是 left-to-right.
我想在 OpenGL 和 GLFW3 中绘制带孔的形状。我怎样才能做到这一点?我不想使用 gluTessBeginPolygon
.
这是一个长方形,上面有一个长方形孔
如果形状总是一样的,那么最简单的方法就是改变你的形象化方式。它不是带孔的多边形,而是 2 个(或更多)没有孔的多边形。改为绘制:
但是,如果形状是动态变化的,那么在代码中计算这个三角剖分就很困难了。
如果因为孔形状是动态的而不能这样做,那么您可以使用模板缓冲区来防止 OpenGL 在孔所在的位置绘制。清除模板缓冲区,设置渲染模式,以便您只写入模板,然后渲染孔。然后将模式设置回正常但设置模板测试,这样它就不会在模板缓冲区不为零的地方绘制,并渲染矩形。然后恢复正常。
如果你有一个有很多洞的形状(比如 chain-link 栅栏)那么你应该使用带有 alpha 通道的纹理,而不是渲染无数的顶点,并使用 alpha在着色器中进行测试 - 在透明像素上使用
discard;
,这样它们就不会渲染。 fixed-function 的版本是GL_ALPHA_TEST
。如果你有检测一个像素点是否在洞中的公式,你也可以使用
discard;
。您的着色器可以出于您喜欢的任何原因丢弃 - 它不必基于纹理的 alpha 通道。
您不能做的是计算从左到右移动时穿过多边形边界的次数,就像扫描线渲染器那样。这是因为 OpenGL 并行处理所有像素 - 而不是 left-to-right.