Three.js 如何在webgl中捕获这种类型的#define

Three.js 如何在webgl中捕获这种类型的#define,three.js,glsl,Three.js,Glsl,我正在使用一个具有以下语句的着色器: #define SHADER_NAME MeshDepthMaterial 我想防止某些东西被重新申报: #if SHADER_NAME != MeshDepthMaterial varying vec2 foo; #endif 但我不确定如何以及是否可以做到这一点。可以这样做吗?如果可以,怎么做?ThisSHADER\u NAMEconstant从未被Three.js用作条件。(我认为没有办法与meshdethmaterial进行比较,因为它不是

我正在使用一个具有以下语句的着色器:

#define SHADER_NAME MeshDepthMaterial
我想防止某些东西被重新申报:

#if SHADER_NAME != MeshDepthMaterial 
  varying vec2 foo;
#endif

但我不确定如何以及是否可以做到这一点。可以这样做吗?如果可以,怎么做?

This
SHADER\u NAME
constant从未被Three.js用作条件。(我认为没有办法与
meshdethmaterial
进行比较,因为它不是一个真正的数值。它是一个字符串吗?谁知道呢!)

相反,Three.js所做的是。例如:

  • 如果是
    MeshStandardMaterial
    ,则会添加
    #定义标准
  • 如果它是一个
    MeshPhysicalMaterial
    ,它将添加
    #定义物理
然后,它使用这个定义来测试您处理的是什么材料

#ifdef PHYSICAL
    // Perform physical material declarations
#elif defined( STANDARD )
    // Perform standard material declarations
#else
    // Neither type is defined
#endif
(您必须使用
#elif defined()
,因为
#elseifdef
不存在。您可以在“预处理器”下查看所有可用的预处理器指令)

为了向自定义材质添加此类功能,您必须使用JavaScript:

if (material.type = "CustomDepthMaterial") {
    material.defines = { "DEPTH": "" };
}
。。。在着色器中,这将产生

#define SHADER_NAME CustomDepthMaterial
#define DEPTH

。。。然后您可以检查
深度
是否已定义。

我仍然不明白此声明的作用<代码>深度
我可以看到被解释为“真/假”。是不是有些东西被剥去了,如果我要添加一个“参数”列表呢?@pailhead我还没有找到
SHADER\u NAME
的严格功能用途,可能是为了方便。但是,我见过一些GLSL调试器显示此名称,这使得查找您要查找的着色器更容易。听起来它最终与注释非常相似?