我如何在webgl中捕获这种类型的#define

问题描述 投票:2回答:1

我正在使用具有声明的着色器:

#define SHADER_NAME MeshDepthMaterial

我想防止重新声明某些内容:

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

但是我不确定如何以及是否可以做到。能做到吗?如果可以,怎么办?

three.js glsl
1个回答
1
投票

[SHADER_NAME常量从未被Three.js使用作为条件语句。 (我认为没有办法与MeshDepthMaterial进行比较,因为它实际上不是数字值。它是字符串吗?谁知道!)

相反,Three.js所做的是testing if something is defined or not defined。例如:

  • 如果是MeshStandardMaterial,则添加#define STANDARD
  • 如果是MeshPhysicalMaterial,则添加#define PHYSICAL

然后它使用此定义来测试您要处理的材料

#ifdef PHYSICAL
    // Perform physical material declarations
#elif defined( STANDARD )
    // Perform standard material declarations
#else
    // Neither type is defined
#endif

(您必须使用#elif defined(),因为#elseifdef不存在。您可以在“ Preprocessor”下看到所有可用的预处理程序指令on this chart, page 3

为了将这种类型的功能添加到自定义材料中,您必须使用JavaScript进行此操作:

if (material.type = "CustomDepthMaterial") {
    material.defines = { "DEPTH": "" };
}

...在您的着色器中,这应该产生...

#define SHADER_NAME CustomDepthMaterial
#define DEPTH

...,然后您可以检查是否定义了DEPTH

© www.soinside.com 2019 - 2024. All rights reserved.