首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SceneKit着色器不工作

SceneKit着色器不工作
EN

Stack Overflow用户
提问于 2014-12-18 23:41:49
回答 1查看 1.1K关注 0票数 0

我试图在SceneKit上使用iOS 8上的着色器。

代码语言:javascript
复制
let sphere = SCNSphere(radius: 6)
    sphere.segmentCount = 100
    sphere.firstMaterial?.diffuse.contents = UIImage(named: "noise.png")
    sphere.firstMaterial?.diffuse.wrapS = SCNWrapMode.Repeat
    sphere.firstMaterial?.diffuse.wrapT = SCNWrapMode.Repeat
    sphere.firstMaterial?.reflective.contents = UIImage(named: "envmap3")
    sphere.firstMaterial?.fresnelExponent = 1.3

    let sphereNode = SCNNode(geometry: sphere)
    sphereNode.position = SCNVector3(x: 0, y: 0, z: -20)

    let surfaceModifier = NSString(contentsOfFile: NSBundle.mainBundle().pathForResource("carPaint", ofType: "shader")!, encoding: NSUTF8StringEncoding, error: nil)
    sphere.firstMaterial?.shaderModifiers = [SCNShaderModifierEntryPointSurface: surfaceModifier!]

    scene.rootNode.addChildNode(sphereNode)

代码来自WWDC 2013 SceneKit演示,我把它翻译成Swift

这里是该演示的carPaint.shader文件中对应的着色器代码:

代码语言:javascript
复制
float flakeSize = 0.2;
float flakeIntensity = 0.7;

vec3 paintColor0 = vec3(0.9, 0.4, 0.3);
vec3 paintColor1 = vec3(0.9, 0.75, 0.2);
vec3 flakeColor = vec3(flakeIntensity, flakeIntensity, flakeIntensity);

vec3 rnd =  texture2D(u_diffuseTexture, _surface.diffuseTexcoord * vec2(1.0 / flakeSize)).rgb;
rnd = normalize(2 * rnd - 1.0);

vec3 nrm1 = normalize(0.05 * rnd + 0.95 * _surface.normal);
vec3 nrm2 = normalize(0.3 * rnd + 0.4 * _surface.normal);

float fresnel1 = clamp(dot(nrm1, _surface.view), 0.0, 1.0);
float fresnel2 = clamp(dot(nrm2, _surface.view), 0.0, 1.0);

vec3 col = mix(paintColor0, paintColor1, fresnel1);
col += pow(fresnel2, 106.0) * flakeColor;

_surface.normal = nrm1;
_surface.diffuse = vec4(col, 1.0);
_surface.emission = (_surface.reflective * _surface.reflective) * 2.0;
_surface.reflective = vec4(0.0);

下面是控制台输出:http://pastebin.com/JAbJSrxg

该应用程序不会崩溃,但着色器不工作,球体颜色被设置为粉红色。

所以我的问题是,我怎样才能让它发挥作用?我认为我做得对,但显然我做得不对。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-19 06:15:16

您发布的控制台日志显示,着色器的这一行出现了错误:

代码语言:javascript
复制
rnd = normalize(2 * rnd - 1.0);

GLSLES1.0是由OpenGL ES 2.0使用的,这是SceneKit在iOS上使用的,它不支持整数类型。所以它是在抱怨这一行的文字2。您可以通过使它成为浮点文本2.0来解决这个问题。

如果此着色器源与您从其中提取的示例代码项目保持不变,则可能需要报告错误。该着色器代码可以在桌面OpenGL上工作,但是应该编写它,以便它也能在iOS上工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27557665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档