2016-10-01 7 views
1

Я немного коды, как это:Scenekit SCNShadable Texture2D не работаю

let myShader = 
    "#pragma arguments\n" + 
    "sampler uMaskTex;\n" + 
    "uniform sampler2D uMaskTex;\n" + 

    "#pragma body\n" + 

    //none of these work 
    "vec3 mask = texture2D(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    //"vec3 mask = texture2d(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    //"vec3 mask = texture(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    "_output.color.rgb = vec3(1.);" 

я получить розовые сетки. Если я прокомментирую строки texture2D, то шейдер работает. Я не вижу ошибок в консоли. Униформа не нарушает его, так что я предполагаю, что они работают (хотя я действительно смущен, почему мне нужны два из них, один для другого для металла).

Каков правильный способ считывания единого семплера2D из шейдера с помощью этого механизма SCNShadable?

+0

Почему вы отметили это с помощью 'metal'? Вы каким-то образом используете Metal? –

+0

потому что, если я понимаю, что glsl передается на любой язык затенения металла. Я знаю, что у меня были некоторые проблемы с глобальными функциями, подобными этому: http://stackoverflow.com/questions/37762535/scenekit-shader-modifier-for-geometry-entry-points-works-in-ios-but-not -os-x Я использую PBR, и, похоже, он работает с металлом исключительно (получал некоторые предупреждения вдоль этих строк). Вы говорите мне, должен ли он быть помечен металлом или нет? В документации говорится объявить две униформы: одну для металлической для GLSL, хотя я могу написать только GLSL. Я использую металл или нет? – pailhead

+0

@ НикольБолас Я не пытаюсь быть злым или чем-то еще, но, учитывая приведенный ниже ответ, это сделало его более или менее проблемой металла? Мне действительно интересно, в основном потому, что я разочарован сценой и ее документацией :) – pailhead

ответ

3

Это, по-видимому, вызвано чувствительностью пробелов кросс-компилятора шейдера. В частности, если изменить

vec3 mask = texture2D(uMaskTex , vec2(1.,1.)).xyz; 

к

vec3 mask = texture2D(uMaskTex, vec2(1.,1.)).xyz; 

(обратите внимание на отсутствие пробела после первого параметра), это похоже на работу.

Возможно, это стоит filing a bug report. Парсер должен отбросить это пробел вместо того, чтобы рассматривать его как часть идентификатора.

+0

Спасибо! Попробуй это. Любые советы о том, как заставить шейдер выкинуть ошибку? – pailhead

+0

К сожалению, нет. Чтобы отладить это, я установил символическую точку останова на 'newLibrary: options: error:', а затем напечатал исходную строку с помощью 'po $ arg3'. Оттуда я попытался скомпилировать сгенерированную строку в виде файла '.metal' в Xcode, изменив директивы препроцессора до тех пор, пока не ударит ошибку компиляции, из-за которой ваш код не сработает (сгенерированный сэмплер был назван' uMaskTex Sampler', а не 'uMaskTexSampler' Это был простой вывод, чтобы затем понять, что парсер думал, что дополнительное пространство было частью имени сэмплера. – warrenm

+0

Holy $%^$ # ^! Шляпы, это звучит безумно, кажется, что-то вроде работы! – pailhead