Top Banner
OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders
76

OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Mar 01, 2018

Download

Documents

vocong
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL on iOS & OSXLow-level GL, SceneKit, and GLSL Shaders

Page 2: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

Page 3: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

• OpenGL and GLKit bundled with Xcode

Page 4: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

• OpenGL and GLKit bundled with Xcode• GLView and GLViewController available

Page 5: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

• OpenGL and GLKit bundled with Xcode• GLView and GLViewController available

• Works like any other views

Page 6: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

• OpenGL and GLKit bundled with Xcode• GLView and GLViewController available

• Works like any other views • Gestures easily added

Page 7: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

• OpenGL and GLKit bundled with Xcode• GLView and GLViewController available

• Works like any other views • Gestures easily added• GLView manages frame rate, frame,

coordinates, rotation

Page 8: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

Page 9: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

Page 10: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

Page 11: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

GLKView

Page 12: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

GLKView

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

Page 13: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

UIButton

GLKView

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

Page 14: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

UIButton

GLKViewOutlet / Action

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

Page 15: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLView

GLViewController

UIButton

GLKViewOutlet / Action

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

- (IBAction)toggleAnimation

Page 16: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 17: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glEnable(GL_CULL_FACE);

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 18: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glEnable(GL_CULL_FACE);

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 19: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glEnable(GL_CULL_FACE);

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 20: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glEnable(GL_CULL_FACE);

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 21: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glEnable(GL_CULL_FACE);

OpenGL

GLViewController

GLKViewOutlet / Action

self.preferredFramesPerSecond = 60; // Start context and initialize color EAGLContext *context = [[EAGLContext alloc]

initWithAPI:kEAGLRenderingAPIOpenGLES3]; [EAGLContext setCurrentContext:context]; GLKView *glkView = (GLKView *)self.view; glkView.context = context;

Page 22: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit
Page 23: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

Page 24: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else

Page 25: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else• GLKBaseEffect to emulate GL v1

Page 26: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else• GLKBaseEffect to emulate GL v1

• self.effect = [[GLKBaseEffect alloc] init]; [self.effect prepareToDraw];

Page 27: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else• GLKBaseEffect to emulate GL v1

• self.effect = [[[self

• Lighting similar to “Beads” in Final Exam

Page 28: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else• GLKBaseEffect to emulate GL v1

• self.effect = [[[self

• Lighting similar to “Beads” in Final Exam• self.effect.light0.enabled = GL_TRUE;

self.effect.light0.position = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f); self.effect.lightingType = GLKLightingTypePerPixel;// Boost light intensity self.effect.light0.constantAttenuation = 0.7;

Page 29: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• GLKit like glu.h—adds utility but little else• GLKBaseEffect to emulate GL v1

• self.effect = [[[self

• Lighting similar to “Beads” in Final Exam• self.

self. GLKVector4Makeself.// Boost light intensityself.

• This is still way simpler than GL v2+

Page 30: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for

Page 31: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

Page 32: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

Page 33: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

Page 34: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix• ModelView Matrix

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); // Compute the model view matrix for the object rendered with GLKit GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

Page 35: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix• ModelView Matrix• Whatever else you want to use in the shader

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); // Compute the model view matrix for the object rendered with GLKit GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

// Compute the model view matrix for the object rendered with ES2 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); _rotation += self.timeSinceLastUpdate * 0.5f;

Page 36: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix• ModelView Matrix• Whatever else you want to use in the shader

• Compiling Shader Programs

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); // Compute the model view matrix for the object rendered with GLKit GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

// Compute the model view matrix for the object rendered with ES2 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); _rotation += self.timeSinceLastUpdate * 0.5f;

source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];

*shader = glCreateShader(type); glShaderSource(*shader, 1, &source, NULL); glCompileShader(*shader);

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); if (status == 0) { glDeleteShader(*shader); }

Page 37: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix• ModelView Matrix• Whatever else you want to use in the shader

• Compiling Shader Programs• Validating and Linking Shader Programs

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); // Compute the model view matrix for the object rendered with GLKit GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

// Compute the model view matrix for the object rendered with ES2 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); _rotation += self.timeSinceLastUpdate * 0.5f;

source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];

*shader = glCreateShader(type); glShaderSource(*shader, 1, &source, NULL); glCompileShader(*shader);

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); if (status == 0) { glDeleteShader(*shader); }

glValidateProgram(prog); // Check Status After

glLinkProgram(prog); // Check Status After

// Attach vertex shader to program. glAttachShader(_program, vertShader); // Attach fragment shader to program. glAttachShader(_program, fragShader); // Bind attribute locations. // This needs to be done prior to linking. glBindAttribLocation(_program, GLKVertexAttribPosition, "position"); glBindAttribLocation(_program, GLKVertexAttribNormal, “normal”); ...

Page 38: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

You are responsible for• Binding all Buffers with vertex data (also normals, textures)• Set up shader variables including…

• Projection Matrix• ModelView Matrix• Whatever else you want to use in the shader

• Compiling Shader Programs• Validating and Linking Shader Programs• Cleaning up after yourself

glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); glEnableVertexAttribArray(GLKVertexAttribNormal); glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f),

aspect, 0.1f, 100.0f); self.effect.transform.projectionMatrix = projectionMatrix;

GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); // Compute the model view matrix for the object rendered with GLKit GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix);

self.effect.transform.modelviewMatrix = modelViewMatrix;

// Compute the model view matrix for the object rendered with ES2 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); _rotation += self.timeSinceLastUpdate * 0.5f;

source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String];

*shader = glCreateShader(type); glShaderSource(*shader, 1, &source, NULL); glCompileShader(*shader);

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); if (status == 0) { glDeleteShader(*shader); }

glValidateProgram(prog); // Check Status After

glLinkProgram(prog); // Check Status After

// Attach vertex shader to program. glAttachShader(_program, vertShader); // Attach fragment shader to program. glAttachShader(_program, fragShader); // Bind attribute locations. // This needs to be done prior to linking. glBindAttribLocation(_program, GLKVertexAttribPosition, "position"); glBindAttribLocation(_program, GLKVertexAttribNormal, “normal”); ...

glDeleteBuffers(1, &_vertexBuffer); glDeleteVertexArraysOES(1, &_vertexArray); self.effect = nil; if (_program) { glDeleteProgram(_program); _program = 0; }

Page 39: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Vertex)attribute vec4 position; attribute vec3 normal;

varying lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix; uniform mat3 normalMatrix;

void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; }

Page 40: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Vertex)attribute vec4 position; attribute vec3 normal;

varying lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix; uniform mat3 normalMatrix;

void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; }

Page 41: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Vertex)attribute vec4 position; attribute vec3 normal;

varying lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix; uniform mat3 normalMatrix;

void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; }

Page 42: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Vertex)attribute vec4 position; attribute vec3 normal;

varying lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix; uniform mat3 normalMatrix;

void main() { vec3 eyeNormal = normalize(normalMatrix * normal); vec3 lightPosition = vec3(0.0, 0.0, 1.0); vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); colorVarying = diffuseColor * nDotVP; gl_Position = modelViewProjectionMatrix * position; }

Page 43: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Fragment)

varying lowp vec4 colorVarying;

void main() { gl_FragColor = colorVarying; }

Page 44: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Shaders (Fragment)

varying lowp vec4 colorVarying;

void main() { gl_FragColor = colorVarying; }

Page 45: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

Page 46: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• Still using GL v1 style lights

Page 47: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• Still using GL v1 style lights• These snippets didn’t even factor in

materials, textures, and lighting

Page 48: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• Still using GL v1 style lights• These snippets didn’t even factor in

materials, textures, and lighting• Also no model import

Page 49: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• Still using GL v1 style lights• These snippets didn’t even factor in

materials, textures, and lighting• Also no model import

• Plugins to convert .obj format to source arrays (.h & .c files)

#include "cube.h"

const int cubeVertices = 36;

const float cubePositions[108] = { 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, 1, -0.999999, -1, 1, -1, -1, 1, 1,

...

Page 50: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Still Low Level

• Still using GL v1 style lights• These snippets didn’t even factor in

materials, textures, and lighting• Also no model import

• Plugins to convert .obj format to source arrays (.h & .c files)

• Arrays for vertices, positions, texture coordinates, normals

#include "cube.h"

const int cubeVertices = 36;

const float cubePositions[108] = { 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, -1, 1, 1, -0.999999, -1, 1, -1, -1, 1, 1,

...

Page 51: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

Page 52: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework

Page 53: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework• Easy animations, physics

Page 54: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework• Easy animations, physics• Tree-based node system for

geometry, cameras, and lights

Page 55: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework• Easy animations, physics• Tree-based node system for

geometry, cameras, and lights• Import of COLLADA (.cae) files

Page 56: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework• Easy animations, physics• Tree-based node system for

geometry, cameras, and lights• Import of COLLADA (.cae) files

• Much higher level, like Unity3D

Page 57: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit

• Apple’s 3D Framework• Easy animations, physics• Tree-based node system for

geometry, cameras, and lights• Import of COLLADA (.cae) files

• Much higher level, like Unity3D• But, OpenGL underneath with

built in shader programs

Page 58: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 59: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 60: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

SCNCameraxFov / yFov zNear, zFar orthographic ...

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 61: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]SCNLightType Color Shadow

SCNCameraxFov / yFov zNear, zFar orthographic ...

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 62: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]SCNLightType Color Shadow

SCNCameraxFov / yFov zNear, zFar orthographic ...

SCNGeometry

Materials[] Mesh

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 63: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]SCNLightType Color Shadow

SCNCameraxFov / yFov zNear, zFar orthographic ...

SCNMaterial

Diffuse Ambient Specular Emission Transparent Reflective

SCNGeometry

Materials[] Mesh

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 64: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

SCNNode

SCNNode

SCNNode

SCNLightType Color Shadow

SCNCameraxFov / yFov zNear, zFar orthographic ...

SCNMaterial

Diffuse Ambient Specular Emission Transparent Reflective

SCNGeometry

Materials[] Mesh

http://www.raywenderlich.com/83748/beginning-scene-kit-tutorial

Page 65: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

SCNNode

SCNNode

SCNNode

Page 66: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

SCNNode

SCNNode

SCNNode

Animations on parent apply to all children

Page 67: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SCNScenerootNode

SCNNodeparent Camera Light Geometry

childNodes[]

SCNNode

SCNNode

SCNNode

Animations on parent apply to all children

sunNode.runAction(SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 2, z: 0, duration: 1))) moonNode.runAction(SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 4, z: 0, duration: 1)))

Page 68: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

Page 69: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

• Two methods

Page 70: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

• Two methods1. Completely substitute node render with SCNProgram

Shader.fsh

Shader.vshSCNGeometry

Materials[] Mesh Program

SCNProgramvertexShader fragmentShader

Page 71: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

• Two methods1. Completely substitute node render with

• Both vertex and fragment shaders

Shader.fsh

Shader.vshSCNGeometry

Materials[] Mesh Program

SCNProgramvertexShader fragmentShader

Page 72: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

• Two methods1. Completely substitute node render with

• Both vertex and fragment shaders2. Attach shader modifiers into node’s default program

SCNGeometryMaterials[] Mesh ShaderModifiers{

SCNShaderModifierEntryPointGeometry

SCNShaderModifierEntryPointSurface

SCNShaderModifierEntryPointLightingModel

SCNShaderModifierEntryPointFragment

Page 73: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

SceneKit Exposes Shaders

• Two methods1. Completely substitute node render with

• Both vertex and fragment shaders2. Attach shader modifiers into node’s default program

• 4 injection points exposed with structs and variables

SCNGeometryMaterials[] Mesh ShaderModifiers{

SCNShaderModifierEntryPointGeometry

SCNShaderModifierEntryPointSurface

SCNShaderModifierEntryPointLightingModel

SCNShaderModifierEntryPointFragment

Page 74: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Sample Geometry Shader Fragment

const float normalScaling = 1.5; const float timeScale = 3.0;

_geometry.position += vec4(_geometry.normal, 0.0) * sin(u_time * timeScale) * normalScaling;

Page 75: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Sample Geometry Shader Fragment

const float normalScaling = 1.5; const float timeScale = 3.0;

_geometry.position += vec4(_geometry.normal, 0.0) * sin(u_time * timeScale) * normalScaling;

Page 76: OpenGL on iOS & OSX - Nathanael Beisiegelbeisiegel.me/files/SceneKitShaders.pdf · OpenGL on iOS & OSX Low-level GL, SceneKit, and GLSL Shaders. OpenGL. OpenGL • OpenGL and GLKit

Demo