在GLSL中为renderscript创建自定义着色器时,程序构建器似乎将结构I绑定的所有成员作为统一常量转换为浮点数或vec,而不管它们指定的类型是什么。此外,我有一个制服,在编译时报告以下错误:“无法链接程序,L0010,统一”统一名称在这里“精度不同。”。我在两个不同的结构中有相同的命名统一,分别绑定到顶点和片段着色器。
[编辑] 感谢第二部分的答案。关于第一部分,我将尝试更清楚。在java端构建我的着色器程序时,我将常量绑定到程序构建器(顶点和片段),输入是绑定到renderscript结构的java变量。一切都很好,我的所有浮点变量都可以作为着色器程序中的制服完全访问。但是,如果结构有一个成员,如bool或int类型,我尝试的东西,如if(i == UNI_memberInt)其中i是在着色器中声明的整数计数器或if(UNI_memberBool)然后我得到的错误沿着“无法比较int到float”或“if()条件必须是布尔类型”,这表明数据没有使GLSL程序保持原样。我可以通过使它们浮动值并使用像0.0这样的东西来解决这个问题,因为GLSL要求浮点值0始终是精确的但对我来说似乎很粗糙。如果我尝试在for循环中使用UNI_memberInt作为停止条件,则会发生类似的事情。
答案 0 :(得分:1)
感谢您在开发人员的环聊中提问。不幸的是,Renderscript团队的工程师并不十分理解你问题的第一部分。如果你能澄清那将是伟大的。至于第二部分,这是一个已知的错误。
基本上,如果在顶点和片段着色器中都有一个统一的“foo”,则顶点着色器是高精度的,并且片段着色器是中等的,这是GLSL编译器无法处理的。不幸的是,解决方案是两者之间没有任何名称冲突。