2011-07-10 50 views
1

我創建了一個基本的正交着色器,用於顯示紋理中的精靈。它效果很好。正投影中居中縮放效果的着色器有什麼問題?

我已經爲它添加了一個「縮放」因子,以允許精靈變大或變小。假設紋理以「左下角」的原點爲起點,它所做的是朝着原點收縮,或者從原點向右上方擴展。我真正想要的是縮小或擴大「到位」以保持中心。

因此,實現這一目標的一種方法是弄清楚我將縮小或擴展多少像素,並進行補償。我不太確定我會怎麼做,我也知道這不是最好的方式。我愚弄我的翻譯和規模的順序,認爲我可以先縮放然後放置,但我得到各種不好的結果。我無法用頭來解決問題。

這裏是我的着色器:


// Set up orthographic projection (960 x 640) 
mat4 projectionMatrix = mat4(2.0/960.0, 0.0, 0.0, -1.0, 
          0.0, 2.0/640.0, 0.0, -1.0, 
          0.0, 0.0, -1.0, 0.0, 
          0.0, 0.0, 0.0, 1.0);       

void main() 
{ 
    // Set position 
    gl_Position = a_position; 

    // Translate by the uniforms for offsetting 
    gl_Position.x += translateX; 
    gl_Position.y += translateY; 

    // Apply our (pre-computed) zoom factor to the X and Y of our matrix 
    projectionMatrix[0][0] *= zoomFactorX; 
    projectionMatrix[1][1] *= zoomFactorY; 

    // Translate 
    gl_Position *= projectionMatrix; 

    // Pass right along to the frag shader 
    v_texCoord = a_texCoord; 
} 

回答

1
mat4 projectionMatrix = 

矩陣在GLSL構造柱明智的。對於mat4,前4個值是第一列,接下來的4個值是第二列,依此類推。

您調換了矩陣。

此外,這些-1是什麼?

對於你的問題的其餘部分,縮放不是投影矩陣應該處理的事情。不是你談論的那種縮放。在將它們與投影矩陣相乘之前,應將比例應用於位置。就像3D對象一樣。

你沒有發佈你的精靈的頂點數據是什麼,所以沒有辦法知道肯定。但是應該的工作方式是精靈的頂點位置應該集中在精靈的中心(這是您定義的任何位置)。因此,如果你有一個16x24的精靈,並且你想讓精靈的中心向右偏移8個像素並且向上偏移8個像素,那麼你的精靈矩形應該是(-8,-8)到(8,16) (從左下角座標系)。

然後,如果您縮放它,它將圍繞精靈座標系的中心縮放。