2015-01-11 4 views
0

Я работаю над рельефом для простой игры SceneKit и пытаюсь применить различные материалы к одной и той же сетке для эффекта карты splat. Рельеф обработан процедурой, поэтому я не могу смоделировать его в Collada и загрузить его с использованием текстур.Splatmap для местности SceneKit

Похоже, что среди других игровых движков применять материалы/текстуры к местности - это использовать карту splat. У SceneKit нет такой конструкции или простого способа сделать ландшафт.

То, что я попытался было процедурно генерировать карту прозрачности для различных текстур/цвета, а затем добавить эти материалы в геометрии что-то вроде ...

var alphaMaps = [NSBitmapImageRep]() 
    for x in 0..<4{ 
     alphaMaps.append(createBitmapImage()!) 
    } 

    var x = 0 
    var y = 0 

    let waterLevel = 0 
    let snowLevel = 241 
    let mountainLevel = 200 

    for tile in self.map.sortedTiles{ 
     let height = Int(tile.height) 
     println("Height\(height)") 
     var onLevel = -1 
     if height < waterLevel{ 
      onLevel = 0 
     } 
     ... 
     for i in 0..<4{ 
      var color = NSColor(deviceRed: 0, green: 0, blue: 0, alpha: i == onLevel ? 0 : 1) 
      alphaMaps[i].setColor(color, atX: x, y: y) 
     } 
     ... generate the geometry 
    } 
    var materials = [SCNMaterial]() 
    for h in 0..<4{ 
     let mat = SCNMaterial() 
     switch(h){ 
     case 0: 
      mat.diffuse.contents = NSColor.blueColor() 
     case 1: 
      mat.diffuse.contents = NSColor.greenColor() 
     case 2: 
      mat.diffuse.contents = NSColor.brownColor() 
     case 3: 
      mat.diffuse.contents = NSColor.whiteColor() 
     default: 
      println("FAIL") 
     } 

     mat.transparent.contents = alphaMaps[h].CGImage 
     materials.append(mat) 
    } 

    geometry.materials = materials 

Я проверил, что альфа-карты являются правильными, но они, похоже, не соблюдаются. Используется только первый материал, и он не использует прозрачное изображение.

Вот пример альфа-карты, не черная часть прозрачна: Simple Alpha Map

Есть ли способ, чтобы сделать карту пейнтбольной в SceneKit? Или указатели на то, как исправить происходящее? Нужно ли мне вникать в пользовательский шейдер?

+0

Возможно, вам необходимо изучить пользовательские шейдеры или, скорее всего, только модификаторы шейдеров. Трудно назначить совершенно новый материал, но довольно легко изменить материальное свойство или два (например, диффузный, зеркальный или нормальный). –

+0

Однако я не уверен, что именно вы пытаетесь изменить между различными материалами, или сколько разных конфигураций вы пытаетесь использовать на одном элементе. –

ответ

0

Я выяснил, что проблема была неправильной координаты текстуры. а затем дублировать геометрию на несколько узлов и применять отдельный материал к каждому узлу. Я не доволен тем, как все это работает, поскольку это заставляет меня в четыре раза загружать верт. Я собираюсь изучить другой способ сделать это.