2016-11-24 77 views
0

我正在嘗試高效地創建一個譜。目前我正在使用紋理緩衝區循環遍歷整個紋理緩衝區並將新數據推送到「隊列」,從而在CPU上完成所有任務。但是,這會花費我很多CPU時間。我想將新的像素數據列添加到紋理,將舊數據移動到右側,以便新數據顯示在左側,而舊數據移到右側。這將創建一個瀑布/ sidescrolling效果,如果我每幀都做。OpenGL - 向紋理添加新數據

我正在使用glTexSubImage2D()添加新數據,但這不會將舊數據向右推進。我如何通過使用OpenGL來實現這一點?

回答

2

我看不到需要移動任何數據。簡單地將紋理視爲水平方向上的圓形,基本上是一個圓形的列緩衝區。然後在渲染過程中通過選擇紋理座標來嚇唬滾動。

假設您要一次顯示n列。創建的寬度n紋理,並且在每個步驟k存儲在紋理的k % n列中的數據:

glTexSubImage(GL_TEXTURE_2D, 0, k % n, 0, 1, height, ...); 

然後使用紋理範圍1 + (k % n)/n座標(k % n)/n在水平方向上,與所述紋理渦卷模式集到GL_REPEAT。或者將偏移量傳遞給着色器,並將其添加到GLSL代碼中的紋理座標中。

當然,如果您提前獲得所有數據,但數量並不是很大,那麼您可以將其全部存儲在紋理中,然後通過移動紋理座標來滾動。

1

如果按照您說的方式執行此操作,將會很昂貴。您需要將紋理中的數據複製回cpu(或在cpu上保留一個副本),然後將數據添加到其中,然後使用glTexSubImage2D將新圖像再次複製到整個

另一種方法是,如果您已經知道所有數據,則將其全部放入紋理中,然後將紋理緩慢移至右側。如果你需要,你可以做一個黑色的方塊來覆蓋你不想看到的紋理部分。

您也可以在兩者之間創建多個紋理,每次獲取足夠的數據時創建一個新紋理,並連續移動它們。

0

它可以通過片段着色器(或像素着色器)完成。該着色器由系統的GPU執行。有不同的着色語言可供使用。來自nVidia(cg Shader)的其他着色語言和其他語言均爲GLSL或HLSL由微軟提供。使用着色器是可能的(它們被用於這種目的)。 而且你的CPU時間肯定會減少,因爲它由GPU執行。