2013-08-23 114 views
0

我正在爲opengl編寫一個lwjgl紋理地圖集,並且我的紋理地圖集創建工作正常,但是當我去渲染它時,對象顯示出來,但它完全是黑色的。我認爲這是因爲我的紋理座標位於紋理圖集的空白部分。由於我沒有正確設置混合,並且由於對象是我渲染的第一個東西,Alpha變成了完全黑色。我知道這是因爲我在0,0,0處提供了一個測試四元組,並可以看到該對象的輪廓。當我以其他順序渲染它們時,輪廓不在那裏,因爲那時混合效果正常。這裏是我的紋理座標移位代碼來改變座標m_height和m_width是整個紋理圖集和x,y,w的高度和寬度,並且是地圖集x,y中紋理的位置,寬度和高度。 y來自左上角,texCoordinate2D來自左下角,我相信這就是爲什麼我要做m_height-yh。它可以正常使用紋理而不是圖集。紋理地圖集紋理座標數學

public TexCoordinate2D getTextureCoord(int x, int y, int w, int h, 
             TexCoordinate2D coord) { 
    int nx = x; 
    int ny = (m_height - y) - h; 
    //to fix m_repeat 
    float cx = coord.getX();//going to fix repeat here 
    float cy = coord.getY(); 
    int cpx = (int) (nx + (cx * w)); 
    int cpy = (int) (ny + (cy * h)); 
    float ncoordx = cpx/(float) m_width; 
    float ncoordy = cpy/(float) m_height; 
    System.out.println("Rect: " + x + " " + y + " " + w + " " + h); 
    System.out.println("Coord: x: " + coord.getX() + " y: " + coord.getY()); 
    System.out.println("Coord--> pixel: x: " + cpx + " y: " + cpy); 
    System.out.println("Pixel-->Coord: x: " + ncoordx + " y: " + ncoordy); 
    TexCoordinate2D newCoord = new TexCoordinate2D(ncoordx, ncoordy); 
    m_coordinates.add(newCoord); 
    return newCoord; 
} 

下面是一些打印

Rect: 0 0 512 512 #The rectangle from the top left corner of atlas 
Coord: x: 0.5004405 y: 0.55040383 #The input coord from bottom left corner of texture 
Coord--> pixel: x: 256 y: 3865 #The pixel location in the atlas of the input coord the from bottom left corner 
Pixel-->Coord: x: 0.0625 y: 0.9436035 #The coordinates in the atlas (The finished product) 
Rect: 3072 0 256 256 #Starts again 
Coord: x: 0.56088686 y: 0.5795429 
Coord--> pixel: x: 3215 y: 3988 
Pixel-->Coord: x: 0.7849121 y: 0.9736328 
Rect: 2560 0 512 512 
Coord: x: 0.18178056 y: 0.35738176 
Coord--> pixel: x: 2653 y: 3766 
Pixel-->Coord: x: 0.6477051 y: 0.9194336 

那麼,什麼是錯誤?

+0

在這個例子中,我在驗證紋理座標數學時遇到了麻煩,你使用了什麼樣的分辨率紋理圖集? –

+0

我正在使用一個4096x4096的紋理,一個很大的紋理 – Vastsuperking

回答

1

(0,0)在OpenGL標準化紋理座標左下角,(1,1)在右上角。

從你的輸出示例,我看到:

Rect: 1024 0 512 512 
Coord: x: 0.737651 y: 0.30223513 
Coord--> pixel: x: 1401 y: 4249 
Pixel-->Coord: x: 0.34212455 y: 1.0376068 (texture coordinates ?) 

您正在使用的紋理座標在這個例子中是標準化的範圍之外。發生這種情況時,行爲取決於紋理環繞狀態。座標可以簡單地夾緊,邊框顏色可以使用,紋理可能重複(默認),鏡像可以使用,等

由於默認的紋理包的行爲(重複),你的T (1.0376068)的座標本質上變成(0.0376068)。紋理地圖集環境下的紋理包裝很少有意義,所以如果座標超出範圍可能意味着您做錯了某些事情:)

您還需要知道您的紋理座標需要對齊當您從偏離中心的位置採樣時,圖集中的texel中心或附近texel可能會流血。由於幾乎不可能讓屏幕上的每個像素都映射到紋理中心,而不是最簡單的幾何體,通常的解決方案就是與它一起生活......在地圖集中的每個紋理周圍放置一個邊框,以便即使最近紋理元素靠近紋理的邊緣,紋理過濾從不會從相鄰紋理的樣本中獲取。

+0

我覺得它正在打包並看到打印出來,所以我通過添加coord.x - Floor(coord.x)來解決這個問題,我認爲輸出可能來自一個較舊的測試,堅持,讓我檢查。 – Vastsuperking

+0

我可以添加一個填充到我的紋理地圖集沒有問題,我已經有了,但是這些都不能解決我的問題,我的y計算有些問題,但我不知道是什麼。 – Vastsuperking