根据与物体的距离改变颜色

时间:2016-09-17 06:09:17

标签: graphics opengl-es three.js glsl

我有两个对象:让我们称它们为object1和object2。我可以移动object2,我想根据它与object1的距离来改变object2的颜色。我怎么能在GLSL中这样做?我对此很新,但我认为我应该将顶点着色器中的矩阵传递给片段着色器,但我不确定是哪一个。

2 个答案:

答案 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上(在你的一个游戏逻辑文件中)进行计算,然后使用统一变量发送计算出的距离。这将是更高效,更简单的使用方式,每个顶点只有一种颜色。