2016-09-17 73 views
0

我有兩個對象:我們稱它們爲object1和object2。我可以移動object2,並且我想根據它與object1的距離來改變object2的顏色。我如何在GLSL中做到這一點?我對此很陌生,但我認爲我應該從頂點着色器傳遞一個矩陣到片段着色器,但我不確定哪一個。根據距物體的距離改變顏色

回答

0

無法在頂點着色器中計算2個對象之間的距離,至少在OpenGL ES中這是不可能的。

顧名思義,頂點着色器只能訪問與該特定頂點相關的數據。

因此,針對您的問題的正確解決方案是通過統一變量向Object2提供顏色。顏色將根據物體之間的距離進行計算,只有顏色可以輸入到OpgnGL中。

+0

對不起,我還是很困惑。我在哪個文件中將object2提供給?我認爲我們控制片段着色器文件中的顏色。目前,我有一個object1的頂點着色器文件,object2的頂點着色器文件,object1的片段着色器文件和object2的片段着色器文件。 – fluffychaos

0

您可以想象在頂點或片段着色器中執行此操作的方式是在繪製對象2時發送對象1(或其模型矩陣)的位置,反之亦然。然後,您可以有這樣的事情(注意,這是不是GL-ES語法,我從來沒有使用過它)

layout (location = 0) in vec3 in_position; 

layout (location = 0) out float out_distance; 

uniform mat4 u_model; 
uniform mat4 u_otherObjectModel; 
uniform mat4 u_view; 
uniform mat4 u_proj; 

void main() 
{ 
    gl_Position = u_proj * u_view * u_model * vec4(in_position, 1.0); 
    vec3 p0 = vec3(u_model * vec4(in_position, 1.0)); 

    // Here I consider the model is centered on zero 
    vec3 p1 = vec3(u_otherObjectModel * vec4(0, 0, 0, 1)); 
    out_dist = length(p0 - p1); 
} 

有此方法的兩個主要缺點(一個暗示除外)

  • 是您可以計算當前對象每個頂點的距離,並對這兩個對象執行此操作可能效率不高
  • 由於您計算一個對象的每個頂點與另一個對象的中心之間的距離,因此對象不會有獨特的顏色。

我會做什麼,由codetiger指出,不計算在GPU上的距離,但這樣做在CPU上(在你的遊戲邏輯文件中的一個),然後使用統一的變量發送計算出的距離。這將是更高效,更簡單的方法,並且每個頂點只有一種顏色。