2013-07-02 148 views
1

我想在opengl中創建一個簡單的3D數組可視化。 3D陣列包含顏色值。 爲了達到這個目的,我可以畫出許多立方體,給它們紋理座標以指向正確的紋理元素。那麼,我試了一下,它的工作原理。 但是我需要更多的東西,並且實現我想要的唯一方法是在平面打開時,如果我在其他軸方向上的每個網格上繪製完整的2D平面,並且這是6個方向。因此,例如:我在-15到+15之間繪製了XY平面,在Z-座標-15到+15上繪製了XY平面,並且這也適用於後XY平面,YZ平面,後YZ平面.. 這樣,我可以在每個角落都放上3D紋理座標,而插值應該完成剩下的工作。opengl中的完美(3D)紋理映射

我已經將數組座標作爲紋理座標,介於0和32之間,原因是在着色器中,我可以放置紋理座標,然後將其除以32得到每個確切的紋理元素網格上的像素。

但是,唉...像素着色器不斷懷疑的選擇,一個像素映射到不同的紋理像素比下一個像素,而下下再次像素正確地映射。

我用來解決這些類型的問題,加入0.5或0.35至彩車,以確保在花車所有硬件平臺上正確的舍入,但它似乎仍然這樣一個黑客給我。此外,它不適用於3D紋理。

誰能告訴我如何處理?

回答

6

誰能告訴我該如何處理呢?

您正在進入臭名昭着的fenceposting問題。簡單地說,紋理座標0和1不是像素中心,而是像素邊界。看看這個簡單的草圖

| 0 | 1 | 2 | 3 | 
^   ^
0.0    1.0 

    0 1 2 3 4 
--- --- --- --- --- 
    4 4 4 4 4 

因此,要解決像素(比如0)紋理寬ñ(比如4)像素,你必須使用紋理座標

(i/N + (i+1)/N)/2 = i/2N + (i+1)/2N = (2i + 1)/2N = (i + 0.5)/N 

所以補充說0.5不是黑客。但是在着色器中,您可以僅使用texelFetch來解決絕對像素中的紋理,而不是採樣座標。但是,你必須實現過濾自己。

+1

特別是你的texelFetch選項是非常有幫助的。我實際上並不知道它存在,並且一直在想,爲什麼沒有TEXTURE RECT風格的1D和3D紋理版本。 – scippie