Graphics 根据与对象的距离更改颜色

Graphics 根据与对象的距离更改颜色,graphics,opengl-es,three.js,glsl,Graphics,Opengl Es,Three.js,Glsl,我有两个对象:让我们称它们为object1和object2。我可以移动object2,我想根据object2与object1的距离更改object2的颜色。如何在GLSL中执行此操作?我对此非常陌生,但我认为我应该将矩阵从顶点着色器传递到片段着色器,尽管我不确定是哪一个。在顶点着色器中无法计算两个对象之间的距离,至少在OpenGL ES中是不可能的 顾名思义,顶点着色器只能访问与该顶点相关的数据 因此,您的问题的正确解决方案是通过统一变量为Object2提供颜色。颜色将根据对象之间的距离进行计算

我有两个对象:让我们称它们为object1和object2。我可以移动object2,我想根据object2与object1的距离更改object2的颜色。如何在GLSL中执行此操作?我对此非常陌生,但我认为我应该将矩阵从顶点着色器传递到片段着色器,尽管我不确定是哪一个。

在顶点着色器中无法计算两个对象之间的距离,至少在OpenGL ES中是不可能的

顾名思义,顶点着色器只能访问与该顶点相关的数据


因此,您的问题的正确解决方案是通过统一变量为Object2提供颜色。颜色将根据对象之间的距离进行计算,仅颜色可以输入OpgnGL。

在顶点着色器中无法计算两个对象之间的距离,至少在OpenGL ES中是不可能的。

顾名思义,顶点着色器只能访问与该顶点相关的数据


因此,您的问题的正确解决方案是通过统一变量向Object2提供颜色。颜色将基于对象之间的距离进行计算,只需将颜色输入OpgnGL。

您可以想象在顶点或片段着色器中这样做的方式是发送对象1的位置(或它的模型矩阵)绘制对象2时,反之亦然。然后可以有类似的内容(注意,这不是gl es语法,我从未使用过)

这种方法有两个主要缺点(一个意味着另一个)

  • 计算当前对象的每个顶点的距离,并对两个对象执行此操作,这可能不是非常有效的
  • 由于计算一个对象的每个顶点与另一个对象的中心之间的距离,因此对象将不会具有唯一的颜色

正如codetiger所指出的,我要做的不是在GPU上计算距离,而是在CPU上计算距离(在游戏逻辑文件中)然后使用统一变量发送计算出的距离。这将更有效、更简单,并且每个顶点只有一种颜色。

您可以想象在顶点或碎片着色器中这样做的方式是发送对象1(或其模型矩阵)的位置当您绘制对象2时,反之亦然。然后您可以得到类似的内容(注意,这不是gl es语法,我从未使用过它)

这种方法有两个主要缺点(一个意味着另一个)

  • 计算当前对象的每个顶点的距离,并对两个对象执行此操作,这可能不是非常有效的
  • 由于计算一个对象的每个顶点与另一个对象的中心之间的距离,因此对象将不会具有唯一的颜色

正如codetiger所指出的,我要做的不是在GPU上计算距离,而是在CPU上计算距离(在游戏逻辑文件中)然后使用统一变量发送计算出的距离。这将更有效,使用更简单,每个顶点只有一种颜色。

抱歉,我仍然感到困惑。我应该将object2馈送到哪个文件?我以为我们可以控制片段着色器文件中的颜色。目前我有一个object1的顶点着色器文件,一个顶点着色器文件e代表object2,object1代表一个片段着色器文件,object2代表一个片段着色器文件。抱歉,我仍然感到困惑。我应该将object2馈送到哪个文件?我以为我们可以控制片段着色器文件中的颜色。目前,我有object1代表一个顶点着色器文件,object2代表一个顶点着色器文件,object1代表一个片段着色器文件,还有一个片段着色器文件object2的着色器文件。
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);
}