【发布时间】:2023-03-04 22:49:01
【问题描述】:
是否可以在使用 SceneKit 时创建自定义剪切平面?由于您可以提供自己的着色器,我唯一需要做的就是以某种方式启用 GL_CLIP_DISTANCE0。这是可能的还是我必须坚持使用较低级别的库?
编辑:
我尝试使用渲染器委托启用 GL 状态 GL_CLIP_DISTANCE0,但没有效果。以下是相关代码部分:
class GameViewController: NSViewController, SCNSceneRendererDelegate {
@IBOutlet weak var gameView: GameView!
override func awakeFromNib() {
let attrs: [Int] = [
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 24,
NSOpenGLPFAOpenGLProfile,
NSOpenGLProfileVersion3_2Core,
0
]
let pixelFormat: NSOpenGLPixelFormat = NSOpenGLPixelFormat(attributes: UnsafePointer<NSOpenGLPixelFormatAttribute>(attrs))
gameView.pixelFormat = pixelFormat
let scene = SCNScene()
let obj = SCNSphere(radius: 1.0)
obj.shaderModifiers = [SCNShaderModifierEntryPointGeometry: "gl_CLipDistance[0] = 0.0;"]
let objNode = SCNNode(geometry: obj)
scene.rootNode.addChildNode(objNode)
// ... create camera and lights ...
// set renderer delegate
self.gameView.delegate = self
// set the scene to the view
self.gameView!.scene = scene
self.gameView!.backgroundColor = NSColor.blackColor()
}
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
glEnable(GLenum(GL_CLIP_DISTANCE0))
}
}
无论我尝试什么,我都会收到以下错误:
SceneKit: error, 2: uniform mat4 u_normalTransform;
SceneKit: error, 3: uniform mat4 u_projectionTransform;
SceneKit: error, 4: uniform mat4 u_modelViewTransform;
SceneKit: error, 5: // In model space, must stay in it
SceneKit: error, 6: struct SCNShaderGeometry
SceneKit: error, 7: {
SceneKit: error, 8: vec4 position;
SceneKit: error, 9: vec3 normal;
SceneKit: error, 10: vec4 tangent;
SceneKit: error, 11: vec4 color;
SceneKit: error, 12: vec2 texcoords[8]; // MAX_UV
SceneKit: error, 13: } _geometry;
SceneKit: error, 14: struct SCNShaderSurface
SceneKit: error, 15: {
SceneKit: error, 16: vec3 view; // in view space
SceneKit: error, 17: vec3 position; // in view space
SceneKit: error, 18: vec3 normal; // in view space
SceneKit: error, 19: vec3 tangent; // in view space
SceneKit: error, 20: vec3 bitangent; // in view space
SceneKit: error, 21: float shininess;
SceneKit: error, 22: float fresnel;
SceneKit: error, 23: vec3 _normalTS; // UNDOCUMENTED in tangent space
SceneKit: error, 24: vec4 diffuse;
SceneKit: error, 25: } _surface;
SceneKit: error, 26: // Attributes
SceneKit: error, 27: attribute vec4 a_position;
SceneKit: error, 28: attribute vec3 a_normal;
SceneKit: error, 29: // Varyings
SceneKit: error, 30: varying vec3 v_position;
SceneKit: error, 31: varying vec3 v_normal;
SceneKit: error, 32: void main(void)
SceneKit: error, 33: {
SceneKit: error, 34: _geometry.position = a_position;
SceneKit: error, 35: _geometry.normal = a_normal;
SceneKit: error, 36: gl_CLipDistance[0] = 0.0;
SceneKit: error, 37: // Transform the geometry elements in view space
SceneKit: error, 38: _surface.position = (u_modelViewTransform * _geometry.position).xyz;
SceneKit: error, 39: _surface.normal = normalize(mat3(u_normalTransform) * _geometry.normal);
SceneKit: error, 40: //if USE_VIEW is 2 we may also need to set _surface.view. todo: make USE_VIEW a mask
SceneKit: error, 41: v_position = _surface.position;
SceneKit: error, 42: v_normal = _surface.normal;
SceneKit: error, 43:
SceneKit: error, 44: // this means that the geometry are still in model space
SceneKit: error, 45: gl_Position = u_projectionTransform * vec4(_surface.position, 1.);
SceneKit: error, 46: }
SceneKit: error, 47:
SceneKit: error, failed to link program: ERROR: 0:36: Use of undeclared identifier 'gl_CLipDistance'
是我做错了什么还是“gl_ClipDistance”在 SceneKit 使用的 OpenGL 版本中根本不可用?
【问题讨论】:
-
您的着色器错误是因为您将
gl_clipDistance大写错误。 -
不幸的是,这不是问题所在。不同的大小写不会改变错误。另外,在OpenGL docs 中,它像我一样大写。
-
@UliHeld:不,不是。您用大写 L 拼写。
-
你是对的!感谢您的关注。不幸的是,它仍然无法正常工作。与此同时,我发现自定义剪辑存在许多兼容性问题。也许使用截锥体进行剪辑更容易。