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调试器显示此名称,这使得查找您要查找的着色器更容易。听起来它最终与注释非常相似?