【发布时间】:2014-10-20 00:02:38
【问题描述】:
我基于 Game 模板创建了一个新项目,其中 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 本身的版本无关。
【问题讨论】:
-
将上下文分配给视图的 eaglContext 属性,为我修复了它(正如 rickster 所建议的那样)。
let scnView = self.view as SCNViewlet context = EAGLContext(API: .OpenGLES3)scnView.eaglContext = context
标签: ios swift opengl-es scenekit fragment-shader