我有兩個對象:我們稱它們爲object1和object2。我可以移動object2,並且我想根據它與object1的距離來改變object2的顏色。我如何在GLSL中做到這一點?我對此很陌生,但我認爲我應該從頂點着色器傳遞一個矩陣到片段着色器,但我不確定哪一個。根據距物體的距離改變顏色
0
A
回答
0
無法在頂點着色器中計算2個對象之間的距離,至少在OpenGL ES中這是不可能的。
顧名思義,頂點着色器只能訪問與該特定頂點相關的數據。
因此,針對您的問題的正確解決方案是通過統一變量向Object2提供顏色。顏色將根據物體之間的距離進行計算,只有顏色可以輸入到OpgnGL中。
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上(在你的遊戲邏輯文件中的一個),然後使用統一的變量發送計算出的距離。這將是更高效,更簡單的方法,並且每個頂點只有一種顏色。
相關問題
- 1. 基於2個物體之間的距離的Lerp顏色
- 2. 移動物體的距離
- 3. 顏色基於距離
- 4. 根據距頁首的距離更改粘貼標題文本
- 5. 遠離Unity3D重疊近距離物體的物體
- 6. Processing and Kinect:根據距傳感器的距離改變視頻的速度
- 7. 根據距離翻譯
- 8. 相機與物體的距離
- 9. 3D物體的相機距離
- 10. 相機和物體之間的距離?
- 11. 使用opencv拍攝物體的距離
- 12. 選擇距離最遠的顏色
- 13. HSL顏色之間的距離測量
- 14. 根據距離原點的距離排序2d點
- 15. 改變漢明距離
- 16. 根據距離改變Y軸上的位置
- 17. 根據iPhone顏色改變顏色
- 18. LibGDX - 如何在相距一定距離處產生物體?
- 19. ListView中的物理距離
- 20. Unity - 根據起源距離改變局部比例
- 21. d3如何均衡距離中心圓周上的物體的距離
- 22. RGBA顏色空間中的顏色相似性/距離
- 23. 隨着距離的增加,精靈的顏色發生變化
- 24. YUV顏色間距
- 25. 距離Cell塔的距離
- 26. 更改text_field_tag的邊距/背景顏色
- 27. 如何根據距離數據庫的距離對數組進行排序
- 28. geom_bar,根據列之間的變化距離可變
- 29. 物理問題:僅根據速度計算距離
- 30. Three.js:PointLight更改距離
對不起,我還是很困惑。我在哪個文件中將object2提供給?我認爲我們控制片段着色器文件中的顏色。目前,我有一個object1的頂點着色器文件,object2的頂點着色器文件,object1的片段着色器文件和object2的片段着色器文件。 – fluffychaos