2014-09-30 5 views
1

У меня есть модель Collada, которую я загружаю в Scenekit. Когда я выполняю hittest на модели, я могу получить координаты текстуры удаленной модели.IOS8 Scenekit painting на текстуре с координатами текстуры

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

Исправьте меня, если я ошибаюсь до сих пор.

До сих пор я читал много статей, но я просто не понимаю, как работают мои шейдеры. (Хотя я получил некоторые напуганные эффекты ;-)

Моя вершинный шейдер:

precision highp float; 

attribute vec4 position; 
attribute vec2 textureCoordinate; 
attribute vec2 aTexureCoordForColor; //coordinates from the hittest 

uniform mat4 modelViewProjection; 

varying vec2 aTexureCoordForColorVarying; // passing to the fragment shader here 
varying vec2 texCoord; 

void main(void) { 
     // Pass along to the fragment shader 
     texCoord = textureCoordinate; 
     aTexureCoordForColorVarying = aTexureCoordForColor; //assigning here 
     // output the projected position 
     gl_Position = modelViewProjection * position; 
} 

мой фрагмент шейдера

precision highp float; 

uniform sampler2D yourTexture; 

uniform vec2 uResolution; 
uniform int uTexureCoordsCount; 

varying vec2 texCoord; 
varying vec2 aTexureCoordForColorVarying; 

void main(void) { 

     ??????????? no idea anymore what to do here 
     gl_FragColor = texture2D(yourTexture, texCoord); 
// 

Если вам нужно больше кода, пожалуйста, дайте мне знать.

ответ

6

Во-первых, шейдеры - это не единственный способ нарисовать материал объекта. Еще один вариант, который может хорошо сработать для вас, - использовать сцену SpriteKit в качестве содержимого материала - см. this answer для некоторой помощи в этом.

Если вы придерживаетесь шейдерного маршрута, вам не нужно переписывать всю программу шейдера, чтобы рисовать поверх существующей текстуры. (Если вы это делаете, вы теряете то, что программа SceneKit предоставляет вам, например, освещение и отображение рельефа. Нет смысла изобретать эти колеса, если вы этого не хотите.) Вместо этого используйте модификатор шейдера - небольшой фрагмент GLSL, который вставлен в Шейдерная программа SceneKit. SCNShadable reference объясняет, как их использовать.

В-третьих, я не уверен, что вы обеспечиваете координаты текстуры в своем шейдере наилучшим образом. Вы хотите, чтобы каждый фрагмент получал одно и то же значение texcoord для точки щелчка, поэтому нет смысла передавать его в GL как атрибут и интерполировать его между этапами вершины и фрагмента. Просто передайте его как униформу и установите эту форму на свой материал с помощью кодирования с ключом. (См SCNShadable reference again для информации о связывании параметров шейдера с КВЦ.)

Наконец, чтобы получить в главном пункте вашего вопроса ... :)

Чтобы изменить выходной цвет фрагмента шейдеров (или шейдер модификатор) в определенном наборе координат текстуры или рядом с ним, просто сравните полученные координаты кликов с текущим набором текс-кодов, которые будут использоваться для регулярного поиска текстуры. Вот пример того, что делает это, идя шейдер модификатор маршрут:

uniform vec2 clickTexcoord; 
// set this from ObjC/Swift code with setValue:forKey: 
// and an NSValue with CGPoint data 

uniform float radius = 0.01; 
// change this to determine how large an area to highlight 

uniform vec3 paintColor = vec4(0.0, 1.0, 0.0); 
// nice and green; you can change this with KVC, too 

#pragma body 

if (distance(_surface.diffuseTexcoord.x, clickTexcoord.x) < radius) { 
    _surface.diffuse.rgb = paintColor 
} 

Используйте этот пример в качестве модификатора SCNShaderModifierEntryPointSurface шейдеров и освещения/затенение по-прежнему будет применяться к результату. Если вы хотите, чтобы ваша краска перекрывала освещение, используйте вместо этого шейдерный модификатор SCNShaderModifierEntryPointFragment, а в наборе снимок GLSL _output.color.rgb вместо _surface.color.rgb.

+0

Wow ... это самая лучшая информация до сих пор ... спасибо. Я буду работать с этой информацией и дам вам знать, что сработало лучше всего. – Vilois

+0

Yep .. спасибо .... все стало намного понятнее ..... Я добавил shaderModifier, немного взломал ваш код выше, но в целом это то же самое ..... большое вам спасибо – Vilois

+0

@rickster ваш ответ ясен, и я подумал, что это поможет мне решить мою проблему.Это не сработало, поэтому я разместил вопрос по адресу http://stackoverflow.com/questions/38999782/how-to-use-a-shadermodifier-to-alter-the-color-of-pecific-triangles -in-a-scngeo в надежде, что кто-то вроде вас может помочь. BTW, первая ссылка «этот ответ», которую вы предоставили, фактически ссылается на ту же «ссылку SCNShadable»; является преднамеренным. Кроме того, в вашей последней заметке вы упоминаете _surface.color, и я думаю, вы имели в виду _surface.diffuse. – PKCLsoft