2016-03-11 54 views
0

我有質感,我可以在OpenGL-ES渲染與正交矩陣:移動的像素在OpenGL-ES(安卓)圍繞

gst_gl_shader_set_uniform_matrix_4fv(shader, "u_transformation", 1, FALSE, identity_matrix); 

我想「周圍的像素」移動:一半頂部朝左,底部的一半朝右下方,如下圖所示。有沒有一種「簡單」的方法來做到這一點?我在Android上。

在這個相關的回答問題How to crop/clip in OpenGL using u_transformation,我能夠保持頂部'a'或底部'e'。在「剪切」兩個場景之後有沒有辦法做到「double gst_gl_shader_set_uniform_matrix_4fv」?

enter image description here

回答

0

Reto中描述的公式回答'半'工作,因爲它們只在左邊產生「a」或在右邊產生「e」,但不是同時產生。

我找到解決的辦法是增加一倍頂點和索引的數量和玩的頂點座標如下:

static const GLfloat vertices[] = { 
1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 0.0f, 0.5f, 
1.0f, -1.0f, 0.0f, 1.0f, 0.5f, 

0.0f, 1.0f, 0.0f, 1.0f, 0.5f, 
-1.0f, 1.0f, 0.0f, 0.0f, 0.5f, 
-1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 
0.0f, -1.0f, 0.0f, 1.0f, 1.0f 
}; 

static const GLushort indices[] = { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7 }; 
1

,你想在這裏的改造不能通過變換矩陣來表示。矩陣只能表示某些類別的轉換。在3D空間中:

  • 3x3矩陣表示線性變換。典型的例子包括旋轉,縮放,鏡像,剪切。
  • 4x3矩陣表示仿射變換。除此之外,這包括翻譯。
  • 如果將三維空間擴展爲具有四個分量的同質座標,則4x4矩陣可以表示其他類別的轉換,如投影。

您草圖中的轉換不屬於上述情況。所以將矩陣應用到頂點將無法做到這一點。

那麼你能做什麼?兩個選項浮現在腦海中:

  1. 如果你可以很容易得出兩個部分(上/下,左/右)分開,可以很明顯的做,簡單的改變使這兩個部分之間的轉換。
  2. 將邏輯應用於着色器代碼中。

對於選項2,您可以在頂點或片段着色器中執行此操作。如果沒有跨越兩個部分之間邊界的基元,則在頂點着色器中處理它會更高效。否則,可以在片段着色器中使用類似的邏輯。

寫生關鍵部分的頂點着色器的情況下,假設你現在有,讓你在左側草圖的安排如下:

// Calculate output position and store it in variable "pos". 
gl_Position = pos; 

要獲得第二佈置,邏輯可能像這樣(沒有經過充分測試...):

if (pos.y > 0.0) { 
    gl_Position = vec4(0.5 * pos.x - 0.5, 2.0 * pos.y - 1.0, pos.zw) 
} else { 
    gl_Position = vec4(0.5 * pos.x + 0.5, 2.0 * pos.y + 1.0, pos.zw); 
} 

的想法是,你檢查頂點是否在頂部或底部的一半,規模/相應做出調整,它的座標空間的上半部分地圖進入左半部分和下半部分座標空間進入右半部分。

這可能是由與sign操作更換條件精簡一些:

float s = sign(pos.y); 
gl_Position = vec4(0.5 * pos.x - sign * 0.5, 2.0 * pos.y - sign, pos.zw); 

一些更多的照顧,將需要如果pos.w不是1.0,如果發生如將透視投影應用於頂點。在這種情況下,您必須在上面的計算中包含w的除法。