gpt4 book ai didi

ios - 为什么 iOS 8 上的 SceneKit 无法编译我的自定义着色器?

转载 作者:可可西里 更新时间:2023-11-01 00:38:18 30 4
gpt4 key购买 nike

我基于游戏模板创建了一个新项目,使用 SceneKit 作为游戏技术,使用 Swift 作为语言。我尝试使用自定义着色器。这是设置代码:

var material = SCNMaterial()
var program = SCNProgram()

// Read the vertex shader file and set its content as our vertex shader
if let vertexShaderPath = NSBundle.mainBundle().pathForResource("VertexShader", ofType:"vsh") {
let vertexShaderAsAString = NSString(contentsOfFile: vertexShaderPath, encoding: NSUTF8StringEncoding, error: nil)
program.vertexShader = vertexShaderAsAString
}

// Read the fragment shader file and set its content as our fragment shader
if let fragmentShaderPath = NSBundle.mainBundle().pathForResource("FragmentShader", ofType:"fsh") {
let fragmentShaderAsAString = NSString(contentsOfFile: fragmentShaderPath, encoding: NSUTF8StringEncoding, error: nil)
program.fragmentShader = fragmentShaderAsAString
}

// Give a meaning to variables used in the shaders
program.setSemantic(SCNGeometrySourceSemanticVertex, forSymbol: "a_position", options: nil)
program.setSemantic(SCNModelViewProjectionTransform, forSymbol: "u_viewProjectionTransformMatrix", options: nil)

material.program = program

// retrieve the ship node
let ship = scene.rootNode.childNodeWithName("shipMesh", recursively: true)
ship.geometry.firstMaterial = material

我的顶点着色器的代码:

#version 300 es

uniform mat4 u_viewProjectionTransformMatrix;
in vec4 a_position;
out vec4 outPosition;

void main() {
outPosition = u_viewProjectionTransformMatrix * a_position;
}

还有我的片段着色器的代码:

#version 300 es

out vec4 outColor;

void main() {
outColor = vec4(1.0, 0.0, 0.0, 1.0)
}

很简单,对吧?但是当我执行这段代码时,出现以下错误:

SceneKit: error, failed to link program: ERROR: 0:1: '' :  version '300' is not supported
ERROR: 0:1: '' : syntax error: #version

我做错了什么?供您引用,#version 200 es 产生相同的结果,因此它似乎与 OpenGL 本身的版本无关。

最佳答案

SceneKit 默认使用 OpenGL ES 2.0 上下文。

如果你想使用 ES3 特性(比如 #version 300 es 着色器)你可以创建一个 EAGLContext将 OpenGL ES 3.0 指定为 API 版本的对象,然后将其分配给 View 的 eaglContext属性(property)。

但是,并非所有 SceneKit 的渲染器功能都支持 ES3,因此您必须进行试验以查看您想要渲染的内容是否有效。另请记住,ES3 需要 A7 GPU——要支持 iPhone 4s/5/5c、iPad 4 及更早版本、iPad mini(非视网膜)和 iPod touch,您将需要 ES2 渲染路径。

如果您坚持使用 ES2 着色器,您会看到一个错误,因为没有 #version 200 es。 ES2 着色器使用 #version 100,或者根本不使用 #version 指令(在这种情况下,100 是隐含的)。

关于ios - 为什么 iOS 8 上的 SceneKit 无法编译我的自定义着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25509598/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com