Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl Scenekit SCNShadable纹理2D不工作_Opengl_Scenekit_Metal - Fatal编程技术网

Opengl Scenekit SCNShadable纹理2D不工作

Opengl Scenekit SCNShadable纹理2D不工作,opengl,scenekit,metal,Opengl,Scenekit,Metal,我有一些这样的代码: 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

我有一些这样的代码:

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.);"
我有一个粉红色的网。如果我注释掉纹理2D线,着色器就会工作。控制台中没有错误。制服也不会弄坏它,所以我认为它们可以工作(尽管我真的很困惑为什么我需要两个,一个用于opengl,另一个用于金属)


使用此SCN适配机制从着色器读取统一采样器2D的正确方法是什么?

这似乎是由着色器交叉编译器的空白敏感度引起的。具体来说,如果我改变

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

(请注意,第一个参数后没有空格),它似乎起作用


这可能是值得的。解析器应该丢弃该空格,而不是将其视为标识符的一部分。

为什么要用
metal
标记它?你是不是在以某种方式使用金属?因为如果我理解glsl会被转换成任何金属的着色语言。我知道我在全局函数方面遇到了一些类似的问题:我使用的是PBR,它似乎只与金属一起工作(在这些方面得到了一些警告)。你告诉我,它是否应该贴上金属标签?文件上说要申报两套制服,一套是金属制服,一套是GLSL制服,尽管我可能只是在写GLSL。我是不是在用金属?@Nicolas我并不是故意小气什么的,但给出了下面的答案,这是否使它或多或少成为一个金属问题?我真的很好奇,主要是因为我对scenekit及其文档感到失望:)谢谢!我会试试这个。关于如何让着色器抛出错误有什么建议吗?很遗憾,没有。为了调试此错误,我在
newLibrary:options:error:
上设置了一个符号断点,然后用
po$arg3
打印源字符串。在那里,我尝试将生成的字符串编译为Xcode中的
.metal
文件,调整预处理器指令,直到它遇到导致代码失败的编译错误(生成的采样器名为
uMaskTex-sampler
,而不是
uMaskTex-sampler
。这是一个简单的推论,然后意识到解析器认为额外的空间是采样器名称的一部分。神圣的$%^$#^!脱帽致敬,这听起来很疯狂,似乎是一项相当大的工作!即使我不碰它,现在也会得到一个白色漫反射颜色。)最后一行。读取“遮罩”纹理可以正确地将其乘以白色(我相信它仍然可以从PBR中获得一些阴影,但它的行为就像漫反射设置为白色而不是黑色一样).注释掉最后一行,将纹理保留到一个变量中,该变量从未在任何地方使用过,但仍然将对象涂成白色。有什么想法吗?下一个在Willows喝啤酒的人是我。发布在这里:
vec3 mask = texture2D( uMaskTex, vec2(1.,1.) ).xyz;