1

我有一个 VB6 应用程序(请不要笑),它通过 BitBlt 和标准的 VB6 绘图功能进行大量绘图。我遇到了性能问题(是的,我会做一些常规技巧,比如绘制到内存中)。所以,我决定研究其他的绘图方式,并接触了 OpenGL。

我一直在做一些实验,做我想做的大部分事情似乎很简单;该应用程序大多只使用非常简单的绘图——相对较大的纯色二维矩形等——但我无法找到与 HatchBrush 或 PatternBrush 类似的东西。

更具体地说,我希望能够指定一个小的单色像素图案,选择一种颜色,并且每当我绘制一个多边形(或其他任何东西)时,而不是它是实心的,让它自动平铺该图案,而不是平移或旋转或倾斜或拉伸,图案的“on”位以指定的颜色显示,而图案的“off”位则显示在我现在正在绘制的区域下绘制的任何内容。

显然我可以自己做所有的计算。也就是说,我可以计算所有线或像素或实际需要绘制的任何内容,而不是绘制为会自动平铺的多边形,然后将它们绘制为线或像素或其他任何内容。但是有没有更简单的方法?就像在 GDI 中一样,您只是说“使用这个画笔绘制这个多边形”?

我猜“纹理”可能能够完成我想要的,但我不清楚(我对此完全陌生,我发现的文档并不完全明显);根据多边形的顶点,似乎纹理可能会倾斜、平移或拉伸图案?而我想要平铺的图案。

除了精确计算像素/线条/需要绘制的任何内容之外,有没有办法做到这一点或类似的方法?

提前感谢您的帮助。

4

5 回答 5

2

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

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

于 2010-06-06T16:13:23.320 回答
1

首先,您确定这里的瓶颈是绘图操作本身吗?Visual Basic 以非常慢而闻名(尤其是如果您的程序被编译为中间 VM 代码 - 这是默认的 AFAIRC。请务必选中编译为本机代码的选项!),如果是您的代码是瓶颈,那么 OpenGL 对您没有多大帮助 - 您需要用其他语言重写您的代码 - 可能是 C 或 C++,但任何 .NET 语言也应该这样做。

OpenGL 包含允许您绘制点画线和多边形的函数,但您不应该使用它们。它们已被弃用很长时间,并在规范的 3.1 版中从 OpenGL 中删除。这是有原因的——这些功能不能很好地映射到现代渲染范例,并且不受现代图形硬件的支持——这意味着如果你使用它们,你很可能会得到一个缓慢的软件回退。

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

您也可以使用您所描述的模板缓冲区,但是......您将如何用模式填充该缓冲区并快速完成?无论如何,您都需要纹理。请记住,在开始绘图之前,您需要每帧清除模板缓冲区。不这样做可能会给您带来巨大的性能损失(“大量”的确切值取决于图形硬件和驱动程序版本)。

也可以使用片段着色器来实现所需的效果,但为此学习着色器对于像您这样的 OpenGL 初学者来说是一种过度杀伤力:-)。

于 2010-06-06T17:11:43.523 回答
0

啊,我想我找到了!我可以在整个视口中以我想要的图案(或者我猜是它的蒙版)的形状制作模板,然后在我想使用该图案进行绘制时启用该模板。

于 2010-06-06T15:16:21.423 回答
0

你可以只使用纹理。将图案放入图像中并打开纹理重复,您就可以开始了。

于 2010-06-06T15:16:38.177 回答
0

一两年前就想通了。

于 2010-06-06T22:39:17.380 回答