我有两个对象:让我们称它们为object1和object2。我可以移动object2,我想根据它与object1的距离来改变object2的颜色。我怎么能在GLSL中这样做?我对此很新,但我认为我应该将顶点着色器中的矩阵传递给片段着色器,但我不确定是哪一个。
答案 0 :(得分:0)
在顶点着色器中无法计算2个对象之间的距离,至少在OpenGL ES中这是不可能的。
顶点着色器,顾名思义,只能访问与该p [articular vertex]相关的数据。
因此,针对您的问题的正确解决方案是通过统一变量为Object2提供颜色。颜色将根据物体之间的距离计算,只有颜色可以输入OpgnGL。
答案 1 :(得分: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上(在你的一个游戏逻辑文件中)进行计算,然后使用统一变量发送计算出的距离。这将是更高效,更简单的使用方式,每个顶点只有一种颜色。