gpt4 book ai didi

iOS+SceneKit : How to apply toon shader on texture?

转载 作者:行者123 更新时间:2023-11-28 19:43:18 24 4
gpt4 key购买 nike

我想在 iOS8+ 上使用带有 SceneKit 的卡通着色器来渲染一个带有地球纹理的球体。我还想添加一个卡通着色器来渲染地球。到目前为止,着色器在光照上工作,但纹理没有被卡通着色器着色(比较下图,纹理也应该是“卡通化的”)。

有人有什么想法吗?

enter image description here

这是我的 View Controller 代码(self.sceneKitView 是 SCNView 的一个实例):

@implementation ToonViewController

- (void)viewDidLoad {

[super viewDidLoad];

SCNScene *scene = [SCNScene scene];

// create and add a camera to the scene
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = [SCNCamera camera];
[scene.rootNode addChildNode:cameraNode];
// place the camera
cameraNode.position = SCNVector3Make(0, 0, 15);

// create and add a light to the scene
SCNNode *lightNode = [SCNNode node];
lightNode.light = [SCNLight light];
lightNode.light.type = SCNLightTypeOmni;
lightNode.position = SCNVector3Make(0, 10, 10);
[scene.rootNode addChildNode:lightNode];

// create and add an ambient light to the scene
SCNNode *ambientLightNode = [SCNNode node];
ambientLightNode.light = [SCNLight light];
ambientLightNode.light.type = SCNLightTypeAmbient;
ambientLightNode.light.color = [UIColor darkGrayColor];
[scene.rootNode addChildNode:ambientLightNode];

// set up the scene
self.sceneKitView.scene = scene;
self.sceneKitView.allowsCameraControl = YES;
self.sceneKitView.showsStatistics = NO;
self.sceneKitView.backgroundColor = [UIColor clearColor];

NSMutableDictionary* shaders = [[NSMutableDictionary alloc] init];
shaders[SCNShaderModifierEntryPointLightingModel] = [[NSString alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"fixed_toon" withExtension:@"shader"]
encoding:NSUTF8StringEncoding
error:nil];

SCNNode* earth = [SCNNode nodeWithGeometry:[SCNSphere sphereWithRadius:5.0]];
earth.position = SCNVector3Make(0.0, 0.0, 0.0);
[scene.rootNode addChildNode:earth];

[earth runAction:[SCNAction repeatActionForever:[SCNAction rotateByX:0.0 y:0.25 z:0.0 duration:1.0]]];

SCNMaterial* earthMaterial = [SCNMaterial material];
earthMaterial.diffuse.contents = [UIImage imageNamed:@"Earth.png"];
earthMaterial.specular.contents = [UIColor whiteColor];
earthMaterial.specular.intensity = 0.2;
earthMaterial.locksAmbientWithDiffuse = NO;
earthMaterial.shaderModifiers = shaders;

earth.geometry.firstMaterial = earthMaterial;

}

@end

这是 fixed_toon.shader 文件:

vec3 lDir = normalize(vec3(0.1, 1.0, 1.0));
float dotProduct = dot(_surface.normal, lDir);

_lightingContribution.diffuse += (dotProduct*dotProduct*_light.intensity.rgb);
_lightingContribution.diffuse = floor(_lightingContribution.diffuse*4.0)/3.0;

vec3 halfVector = normalize(lDir + _surface.view);

dotProduct = max(0.0, pow(max(0.0, dot(_surface.normal, halfVector)), _surface.shininess));
dotProduct = floor(dotProduct*3.0)/3.0;

//_lightingContribution.specular += (dotProduct*_light.intensity.rgb);
_lightingContribution.specular = vec3(0,0,0);

最佳答案

您拥有的着色器只是一个光照着色器。如果你想让地球变得柔和,你需要一个片段着色器。

查看着色器文件,所有数学运算都与光有关。您需要一些可以调整纹理像素颜色的东西。然后使用 SCNShaderModifierEntryPointFragment 入口点连接它。

关于iOS+SceneKit : How to apply toon shader on texture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33477815/

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