2010-06-06 73 views
1

我有一个VB6应用程序(请不要笑),它通过BitBlt和标准VB6绘图功能进行大量绘图。我遇到了性能问题(是的,我做了像绘图到内存这样的常规技巧)。所以,我决定调查其他绘图方式,并且已经发布了OpenGL。OpenGL相当于GDI的HatchBrush或PatternBrush?

我一直在做一些尝试,看起来很简单,做大部分我想要的;该应用程序大多只使用非常简单的绘图 - 相对较大的纯色等2D矩形 - 但我无法找到与HatchBrush或PatternBrush类似的对象。更具体地说,我希望能够指定一个小的单色像素图案,选择一种颜色,并且每当我画一个多边形(或其他)时,而不是实心的,让它自动平铺该图案,而不是翻译或旋转或倾斜或拉伸,图案的“开”位以指定颜色显示,并且图案的“关”位留下显示在我正在绘制的区域下绘制的任何图案。

显然我可以自己做所有的计算。也就是说,我可以计算所有的线条或像素,或者实际需要绘制的任何东西,然后将它们绘制成线条或像素等等,而不是绘制成多边形。但有没有更简单的方法?就像在GDI中,你只是说“用这个画笔绘制这个多边形”?我猜测“纹理”可能能够完成我想要的功能,但对我来说并不清楚(我对此完全陌生,而且我发现的文档并不是完全明显的);但是,我并不清楚这一点。基于多边形的顶点,纹理可能会倾斜或平移或拉伸模式?而我想要的图案平铺。

有没有办法做到这一点,或类似的东西,除了蛮力计算的像素/线/任何需要绘制?

在此先感谢您的帮助。

回答

2

如果我理解正确,那么您正在寻找glPolygonStipple()glLineStipple()

PolygonStipple非常有限,因为它只允许32x32模式,但它应该像PatternBrush一样工作。我不知道如何在VB中实现它。

+0

非常感谢! – 2010-06-06 16:17:57

+0

刚试过 - 这正是我想要的。再次感谢! – 2010-06-06 16:37:11

0

啊,我想我找到了!我可以在整个视口中以我想要的模式(或其掩模,我想)的形状制作模板,然后在我想用该模式绘制模板时启用该模板。

0

您可以使用纹理。将图案放入图像中,然后打开纹理重复,然后您就可以走了。

+0

谢谢,我会研究它。尽管如此,对于我在上面发现的描述(制作视图大小的模板模板)有没有优势?这似乎工作正常,但我不确定这是最好的方法。 再次感谢! – 2010-06-06 15:31:20

1

首先,你确定这是绘图操作本身是瓶颈吗? Visual Basic被称为非常慢(尤其是如果您的程序编译为中间VM代码 - 这是默认的AFAIRC。一定要检查选项编译为本机代码!),如果它是你的代码是瓶颈,那么OpenGL对你无能为力 - 你需要用其他语言重新编写代码 - 可能是C或C++,但是任何.NET lang也应该这样做。

OpenGL包含的功能允许您绘制点刻线和多边形,但不应该使用它们。他们已经弃用了很长时间,并从规范3.1版中的OpenGL中被移除。这就是出于某种原因 - 这些功能无法很好地映射到现代渲染范例,并且不受现代图形硬件的支持 - 这意味着如果您使用它们,您很可能会得到一个软件回退缓慢的。

要走的路是使用一个小纹理作为蒙版,并将其平铺在绘制的多边形上。纹理将被拉伸或压缩以匹配您用顶点指定的纹理坐标。您必须将包装模式设置为GL_REPEAT以获得两个纹理坐标,并计算每个顶点的正确坐标,以便纹理以原始大小显示,重复正确的次数。

您也可以像您所描述的那样使用模板缓冲区,但是......您如何使用该模式填充该缓冲区,并快速执行快速?无论如何你都需要纹理。请记住,在开始绘制之前,您需要清除模板缓冲区的每一帧。如果不这样做可能会损失大量的性能影响(根据图形硬件和驱动程序版本的不同,“大量”的确切值)。

使用片段着色器也可以达到所需的效果,但为此类学习着色器对于像您这样的OpenGL初学者来说会是一个矫枉过正的问题:-)。

+0

但是,glLogicOp仍然可以使用纹理?例如,我需要先创建一个条纹纹理,然后将其映射到矩形上,但是我需要使用逻辑操作(在GDI中执行涉及画笔的栅格操作),并且我没有成功。 感谢您的帮助 al – user461426 2010-10-01 05:41:54