2013-02-20 3 views
1

Я делаю путь на основе игры, используя cocos2d 2.0, который будет произвольно генерировать путь (кривизну) для игрока. Этот путь был создан с использованием box2d's b2EdgeShape. Я хочу, чтобы поместить спрайт ниже этого пути, маршрут я принял это:Создайте спрайт в соответствии с box2d path

  • Спрайт будет показано ниже пути будет непрерывно повторяться, высота которого всегда будет больше, чем высота пути (Parallax фон)

  • белый спрайт впишется ниже пути с помощью CCRenderTexture (моего вопроса)

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

Как сделать этот белый спрайт идеально подходящим под дорожкой, созданной с использованием CCRenderTexture. Я попытался следовать учебнику Tiny Wings по RayWenderlich, но этот учебник основан на OpenGL ES 1.1 и имеет некоторые фиксированные функции конвейера, которые я не могу перенести в OpenGL 2.0 (я не очень хорошо знаю OpenGL для начала). Я бы предпочел использовать cocos2d 2.0, который имеет OpenGL 2.0. Я работал над шейдером фрагментов, используя статический белый спрайт, и этот подход может работать, если я могу постоянно получать этот белый цвет под дорогой. Может ли кто-нибудь указать мне в правильном направлении? Любая помощь будет оценена :)

ответ

1

Если белый спрайт - это просто альфа-маска, вам не нужно это делать. Пример Следуйте Рэй, и я думаю, что все, что вы должны изменить это:

В вашем -init:

// Built-in to Cocos2D v2.0 
[self setShaderProgram: [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionTexture]]; 

... Generate _hillVertices and _hillTexCoords as Ray does ... 

В вашем -draw:

// Built-in to Cocos2D v2.0 
[[self shaderProgram] use]; 
[[self shaderProgram] setUniformForModelViewProjectionMatrix]; 

// vertex data (glVertexPointer is depreciated) 
glEnableVertexAttribArray (kCCVertexAttrib_Position); 
glVertexAttribPointer (kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, _hillVertices); 

// texture data (glTexCoordPointer is depreciated) 
glEnableVertexAttribArray (kCCVertexAttrib_TexCoords); 
glVertexAttribPointer (kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, _hillTexCoords); 

glDrawArrays (GL_TRIANGLE_STRIP, 0, (GLsizei)_nHillVertices); 

У меня есть рабочая реализация, которая аналогична (Я использовал вершины и координаты цвета, без текстуры), поэтому я на самом деле не скомпилировал код выше. Cocos2d v2.0 имеет встроенные шейдеры для использования вершин с текстурами, вершинами с цветами, вершинами с текстурами и цветами и т. Д. Просто выберите соответствующий ключ kCCShader_ *, когда вы устанавливаетеShaderProgram и предоставляете правильные данные.

+0

Я немного смущен, поэтому вы говорите, что альфа-маска не обязательно должна быть CCRenderTexture? Если это не так, то как я буду сравнивать альфа-значения в другом шейдере фрагмента для маскировки? Если это CCRenderTexture, тогда я должен сгенерировать его с помощью метода Рэя, то есть вместо генерации случайных цветов, я должен сгенерировать белый цвет 1.0,1.0,1.0,1.0? –

+0

Извините, я не понял, что вы пытались мне сказать раньше, я немного изучил шейдеры, и теперь я использую kCCShader_Position_uColor вместо того, что вы сказали мне. Теперь я получаю сплошной белый цвет под дорогой. Этот шейдер имеет однородную переменную u_color, а шейдер фрагмента отображает этот цвет. Но я не понимаю, как я получаю этот белый цвет? У меня нет этого кода в моем проекте, который больше генерировал эти CCRenderTextures, я просто создаю простой путь, который не имеет цвета в нем, и показывает b2EdgeShape, когда я включаю Debug Draw. –

+0

Я говорю вам, что вам не нужна альфа-маска для этого (и, вероятно, не хочу). Если вы посмотрите в разделе учебника Рэя «Рисование холма», вы увидите, что он заполняет треугольники земной текстурой (вершины треугольников - это вершины из его кривой). – Pat

Смежные вопросы