2010-06-06 23 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