Как я могу записать этот тип #define в webgl - PullRequest
1 голос
/ 09 мая 2020

Я работаю с шейдером, в котором есть оператор:

#define SHADER_NAME MeshDepthMaterial

Я бы хотел предотвратить повторное объявление чего-либо:

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

Но я не уверен как и если это можно сделать. Можно ли это сделать, и если да, то как?

1 Ответ

2 голосов
/ 09 мая 2020

Эта константа SHADER_NAME никогда не используется в Three. js для условных выражений. (Я не думаю, что есть способ сравнить с MeshDepthMaterial, потому что на самом деле это не числовое значение c. Это строка? Кто знает!)

Вместо этого, что делает Three. js это проверка, если что-то определено или не определено . Например:

  • Если это 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 не существует. Вы можете увидеть все доступные директивы препроцессора на эта таблица, стр. 3 , в разделе «Препроцессор»)

Чтобы добавить этот тип функциональности к вашим пользовательским материалам, вам нужно будет сделать это в JavaScript:

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

... в вашем шейдере это должно дать ...

#define SHADER_NAME CustomDepthMaterial
#define DEPTH

... а затем вы можете проверить, определено ли DEPTH или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...