2013-09-26 62 views
3

我在紋理貼圖/精靈畫面中有一堆緊挨着對方的縮略圖/圖標。從像素到像素的關係,這些像素從145像素平方放大到238像素平方。我在訪問紋理座標時期望在框邊上獲得+ -1或2像素精度,因此我還在縮略圖的頂部繪製了4像素輪廓以隱藏此可能的僞影。但我看到準確度的巨大差異。有時它往往是一個方向,有時是另一個方向。由5-8像素關閉的opengl紋理

我檢查了數學,我無法弄清楚發生了什麼事。

縮略圖正在放大約1.64倍。因此,在源紋理座標中關閉一個像素可能導致屏幕上約2個像素關閉。頂部的4像素白色框架正在以1-1像素到片段的關係繪製,並且應該覆蓋框邊緣兩側的大約2個像素。這部分工作。在這裏,我已經關閉了邊境,以顯示如何遙遠的紋理座標是....

enter image description here

我可以手動調整的數字,讓自己消失。但是我必須將紋理座標寬度/高度縮小几個源像素,並且在某些情況下將5或6像素添加(或減去)起始點。我真的只想讓數學計算出來,或者想知道我在這裏做錯了什麼。這種東西讓我瘋狂!

一堆廢話要知道。

  • 着色器正在做紋理座標在頂點着色器抵消...

    ​​
  • 這個對象是一個箱,其是三角形條帶2三。

  • 不是說它應該重要,但應用於模型的矩陣沒有進行任何縮放。該框是屏幕比例。縮放僅在正在提供的紋理座標中發生。

  • 上面看到的對象的紋理座標是0.00 - 0.07,然後在着色器中添加了每個縮略圖不同的偏移量。 2048年的0.07就像143.原來我在.0708的時候應該更接近145,它更糟糕,並且顯示出更像來自紋理的148個像素。爲了讓它只顯示145個源像素,我必須使它成爲140像素的0.06835。

  • 我試過在計算器中進行數學運算並直接輸入數字。我也試過像= 1305/2048。這些進入GLfloats不是雙打。

  • 此紋理貼圖的圖像是PNG並裝有這些設置:

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    

,但我也試過GL_LINEAR沒有明顯的差異。

  • 我對沒有進行紋理縮放的其他紋理(在同一紋理貼圖中)沒有任何準確性問題。

  • 隨着座標變高,它不會離得越遠。在NEG MAP上方的圖像中,拇指緊挨着HEAT MAP拇指,並且在不同方向上關閉,但在接縫處正確。

  • 這裏是爲這兩個失調數據..

    filterTypes[FT_gradientMap20].thumbTexOffsetS = 0.63720703125; 
    filterTypes[FT_gradientMap20].thumbTexOffsetT = 0.1416015625; 
    filterTypes[FT_gradientMap21].thumbTexOffsetS = 0.7080078125; 
    filterTypes[FT_gradientMap21].thumbTexOffsetT = 0.1416015625; 
    

==== ==== UPDATE

一對夫婦的東西了,我意識到我做錯了蝙蝠並在這裏討論:OpenGL Texture Coordinates in Pixel Space

單個縮略圖的寬度是145.但是這將是0-144,145開始下一個。我使用的寬度是145,所以這將是1像素太大。使用上面的像素類型數學中心,我們實際上應該從0的中心到144的中心。144.5 - 0.5 = 144.

使用他的公式(2i + 1)/(2N)每個起點的偏移量並使用144/2048作爲寬度。這讓事情變得更好,但在一些地區仍然沒有。而且有時候和其他時間再次停留在一個方向上。儘管每個x或y位置都一致。

使用143的寬度證明了更好的結果。但我可以通過手動調整數字來解決這些問題。我想有數學來使它正確。

...或..也許它與min/mag過濾有關 - 儘管我對此有所瞭解,並且我正在做的事情似乎適用於這種情況。

回答

3

經過大量的實驗,不得不創建一個網格內襯的引導紋理,所以我可以看到每個紋理究竟有多遠......我終於明白了!

其實很簡單。

uniform mat4 u_modelViewProjectionMatrix; 
uniform mediump vec2 u_texOffset; 
uniform mediump float u_texScale; 
attribute vec3 a_vertexPosition; 
attribute mediump vec2 a_vertexTexCoord0; 

紋理座標的精度。通過指定中性,它只是修復自己。我懷疑這也將有助於解決我在這個問題上所遇到的問題:

Why is a texture coordinate of 1.0 getting beyond the edge of the texture?

一旦我做到了,我不得不回到我原來的145寬度(這似乎仍然是錯誤的,但很好哦)。而且,我最終還是回到了所有紋理座標上的所有原始數學。 「像素中心」方法顯示了比直/ 2048更多的相鄰像素。

enter image description here