нет соответствующей функции для вызова «точка» и «отражать» - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь запустить приложение ARBrush для iOS, доступное в этом репозитории GitHub .это действительно крутое приложение для рисования 3D!К сожалению, я получаю 2 ошибки.Я не знаю, почему я получаю эти ошибки и как их решить.первая ошибка - «нет соответствующей функции для вызова« точки »» для строки 104 в shaders.metal:

 float diffuseFactor = max(0.0,dot(interpolated.normal, light.direction)); // 1

Вторая - «нет соответствующей функции для вызова« отражения »» в строке 109в том же файле (shaders.metal)

float3 reflection = reflect(light.direction, interpolated.normal); // 2

Ниже приводится мой полный отчет об ошибке

CompileMetalFile /Users/Myname/Documents/Xcode/ARBrush/ARBrush/Shaders.metal (in target: ARBrush)
    cd /Users/Myname/Documents/Xcode/ARBrush
    export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/metal -arch air64 -emit-llvm -c -gline-tables-only -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk -ffast-math -serialize-diagnostics /Users/Myname/Library/Developer/Xcode/DerivedData/ARBrush-amgfmkvulxeadccjphanytgyilwe/Build/Intermediates.noindex/ARBrush.build/Debug-iphoneos/ARBrush.build/Metal/Shaders.dia -o /Users/Myname/Library/Developer/Xcode/DerivedData/ARBrush-amgfmkvulxeadccjphanytgyilwe/Build/Intermediates.noindex/ARBrush.build/Debug-iphoneos/ARBrush.build/Metal/Shaders.air -mios-version-min=11.0 "" -MMD -MT dependencies -MF /Users/Myname/Library/Developer/Xcode/DerivedData/ARBrush-amgfmkvulxeadccjphanytgyilwe/Build/Intermediates.noindex/ARBrush.build/Debug-iphoneos/ARBrush.build/Metal/Shaders.dat /Users/Myname/Documents/Xcode/ARBrush/ARBrush/Shaders.metal

/Users/Myname/Documents/Xcode/ARBrush/ARBrush/Shaders.metal:104:35: error: no matching function for call to 'dot'
    float diffuseFactor = max(0.0,dot(interpolated.normal, light.direction)); // 1
                                  ^~~
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/lib/clang/902.1/include/metal/metal_geometric:171:30: note: candidate template ignored: requirement '_geometric_binary_func_enable<float __attribute__((ext_vector_type(3))), float __attribute__((packed_vector_type(3)))>::value' was not satisfied [with T = float __attribute__((ext_vector_type(3))), U = float __attribute__((packed_vector_type(3)))]
METAL_FUNC make_scalar_t<_O> dot(T x, U y)
                             ^
/Users/Myname/Documents/Xcode/ARBrush/ARBrush/Shaders.metal:109:25: error: no matching function for call to 'reflect'
    float3 reflection = reflect(light.direction, interpolated.normal); // 2
                        ^~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/lib/clang/902.1/include/metal/metal_geometric:354:15: note: candidate template ignored: requirement '_geometric_binary_func_enable<float __attribute__((packed_vector_type(3))), float __attribute__((ext_vector_type(3)))>::value' was not satisfied [with T = float __attribute__((packed_vector_type(3))), U = float __attribute__((ext_vector_type(3)))]
METAL_FUNC _O reflect(T i, U n)
              ^
2 errors generated.

Я запускаю это приложение, используя swift 4 на Xcode 10.1, и моя цель разработки - iOS11. Я буду очень благодарен, если кто-нибудь сможет решить мои проблемы.

Спасибо

1 Ответ

0 голосов
/ 28 января 2019

Я полагаю, что эта проблема возникает из-за того, что функции в стандартной библиотеке Metal не поддерживают упакованные векторные типы.Вы можете исправить это с помощью встроенного преобразования типов на сайте вызова:

float diffuseFactor = max(0.0,dot(interpolated.normal, float3(light.direction))); // 1

float3 reflection = reflect(float3(light.direction), interpolated.normal); // 2

или просто создать локальную переменную неупакованного типа

float3 lightDir(light.direction);

и использовать ее вкаждый вызов вместо передачи члена структуры напрямую.

...