我有一个VB6应用程序(请不要笑),它通过BitBlt和标准VB6绘图功能进行大量绘图。我正在遇到性能问题(是的,我会做常规技巧,比如绘制内存)。所以,我决定研究其他绘图方式,并且已经开始使用OpenGL。
我一直在做一些实验,而且做我想做的大部分事情似乎很简单;应用程序大多只使用非常简单的绘图 - 相对较大的纯色2D矩形等 - 但我无法找到类似于HatchBrush或PatternBrush的东西。
更具体地说,我希望能够指定一个小的单色像素图案,选择一种颜色,每当我绘制一个多边形(或其他),而不是它是实心的,让它自动平铺该模式,而不是翻译或旋转或倾斜或拉伸,图案的“开”位以指定的颜色显示,图案的“关”位显示在我正在绘制的区域下绘制的任何内容。
显然我自己可以做所有的计算。也就是说,不是绘制为多边形,而是以某种方式自动为我平铺,我可以计算所有线条或像素或实际需要绘制的任何内容,然后将它们绘制为线条或像素或其他任何东西。但是有更简单的方法吗?就像在GDI中一样,你只是说“用这个画笔绘制这个多边形”?
我猜测“纹理”可能能够达到我想要的效果,但我不清楚(我对此完全陌生并且我发现的文档并不完全明显);基于多边形的顶点,看起来纹理可能会倾斜或平移或拉伸图案?而我希望图案平铺。
有没有办法做到这一点,或类似的东西,除了蛮力计算完全像素/线/需要绘制的东西?
提前感谢您的帮助。
答案 0 :(得分:2)
如果我理解正确,您正在寻找glPolygonStipple()或glLineStipple()。
PolygonStipple非常有限,因为它只允许32x32模式,但它应该像PatternBrush一样工作。我不知道如何在VB中实现它。
答案 1 :(得分:1)
首先,你确定这是绘图操作本身的瓶颈吗? Visual Basic因速度很慢而闻名(特别是如果您的程序被编译为中间VM代码 - 这是默认的AFAIRC。请确保选中编译为本机代码的选项!),如果它是你的代码是瓶颈,然后OpenGL对你没什么帮助 - 你需要用其他语言重写你的代码 - 可能是C或C ++,但任何.NET语言都应该这样做。
OpenGL包含允许您绘制点画线和多边形的函数,但不应使用它们。它们已经被弃用了很长时间,并且从规范3.1版本的OpenGL中删除了。这是有原因的 - 这些功能不能很好地映射到现代渲染范例,并且不受现代图形硬件的支持 - 这意味着如果使用它们,很可能会得到慢软件后备。< / p>
要采用的方法是使用小纹理作为蒙版,并将其平铺在绘制的多边形上。纹理将被拉伸或压缩以匹配您使用顶点指定的纹理坐标。您必须为两个纹理坐标将包裹模式设置为GL_REPEAT
,并计算每个顶点的正确坐标,以便纹理以其原始大小显示,重复适当的次数。
您也可以按照描述使用模板缓冲区,但是......如何使用模式填充缓冲区,并快速快速?无论如何你需要一个纹理。请记住,在开始绘制之前,需要每帧清除模板缓冲区。如果不这样做可能会让您遭受大量性能损失(“大规模”的确切值取决于图形硬件和驱动程序版本)。
使用片段着色器也可以达到预期的效果,但是对于像你这样的OpenGL初学者来说,学习着色器对你来说是一种过度杀伤力: - )。
答案 2 :(得分:0)
答案 3 :(得分:0)
你可以使用纹理。将图案放入图像中并打开纹理重复,你就可以了。
答案 4 :(得分:0)