2014-01-12 4 views
1

Я новичок в opengl, и я не могу понять, как вы измените альфа/непрозрачность на текстуру, загруженную GLKTextureLoader.Изменение канала альфа/непрозрачности на текстуре с помощью GLKit

Сейчас я просто рисую текстуру с помощью следующего кода.

self.texture.effect.texture2d0.enabled = YES; 
self.texture.effect.texture2d0.name = self.texture.textureInfo.name; 
self.texture.effect.transform.modelviewMatrix = [self modelMatrix]; 
[self.texture.effect prepareToDraw]; 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 

NKTexturedQuad _quad = self.texture.quad; 
long offset = (long)&_quad; 
glVertexAttribPointer(GLKVertexAttribPosition, 
         2, 
         GL_FLOAT, 
         GL_FALSE, 
         sizeof(NKTexturedVertex), 
         (void *)(offset + offsetof(NKTexturedVertex, geometryVertex))); 

glVertexAttribPointer(GLKVertexAttribTexCoord0, 
         2, 
         GL_FLOAT, GL_FALSE, 
         sizeof(NKTexturedVertex), 
         (void *)(offset + offsetof(NKTexturedVertex, textureVertex))); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Любые советы будут очень полезны :)

+0

Итак, вы хотите умножить/модулировать каждую пиксельную альфу некоторой константой? Быстрый взгляд на спецификации GLKit говорит мне, что с GLKit это может быть невозможно, вам понадобится (довольно простой) пользовательский шейдер. Если это то, что вам нужно, я должен быть в состоянии помочь. –

ответ

2

я не являюсь экспертом Г.Л., но рисовать с измененным значением альфа не кажется работать, как описано rickster.

, насколько я понимаю, значение, передаваемое в glBlendColor используется только при использовании glBlendFunc констант, как: GL_CONSTANT_ ...

это будет перезаписывать значения альфа текстуры и использовать определенное значение рисовать:

glEnable(GL_BLEND); 
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); 
glBlendColor(1.0, 1.0, 1.0, yourAlphaValue); 
glDraw... // the draw operations 

дополнительную информацию можно найти здесь http://www.opengl.org/wiki/Blending#Blend_Color

-1

До тех пор, пока вы в OpenGL ES 1.1 мире (или эмулировать-1,1 мир GLKBaseEffect), альфа является свойством либо из (на пиксель) растровых данных в текстуре или (полного) состояния OpenGL ES, с которым вы рисуете. Вы не можете установить уровень непрозрачности для текстуры в целом самостоятельно. Итак, у вас есть три варианта:

  1. Изменить альфа текстуры. Это означает изменение самих данных растрового изображения текстуры - используйте контекст 2D-изображения по вашему выбору, чтобы нарисовать изображение наполовину (или что-то еще) альфа и прочитайте полученное изображение в текстуре OpenGL ES. Вероятно, это не отличная идея, если альфа, которую вы хотите, будет постоянной для жизни вашего приложения. В этом случае вы можете просто вернуться к Photoshop (или тому, что вы используете для создания ваших имиджевых активов) и установить альфа.

  2. Измените альфу, с которой вы рисуете. После того, как вас prepareToDraw, настроить гармонирующий GL:

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); 
    glBlendColor(1.0, 1.0, 1.0, myDesiredAlphaValue); 
    glDraw... // whatever you're drawing 
    

    Не забудьте A) сделать свое частично прозрачное содержимое после любого контента, который вы хотите смешивать сверху и B) отключить смешивание перед визуализацией непрозрачного содержания снова следующий кадр.

  3. Ditch GLKBaseEffect и написать свои собственные шейдеры. Шейдеры, которые работают как конвейер с фиксированной функцией 1.1, представляют собой десяток десятков - вы даже можете начать с использования шейдеров, упакованных с шаблоном проекта Xcode «OpenGL Game», или просмотра шейдеров, которые GLKit записывает в инструмент Xcode Frame Capture. Если у вас есть такие шейдеры, изменение альфа цвета вы получили из текстурных поиска простая операция:

    vec4 color = texture2D(texUnit, texCoord); 
    color.a = myDesiredAlphaValue; 
    gl_FragColor = color;