2013-03-28 3 views
1

РЕДАКТИРОВАТЬ 1: Включено шейдерИзменение уровня непрозрачности в OpenGL ES 2.0

EDIT 2: включено экран выстрелы

РЕДАКТИРОВАТЬ 3: В комплекте с экраном выстрел из исходной текстуры

EDIT 4

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

При ближайшем рассмотрении проблема не совсем решена, цвета не выглядят правильно.

String strFShader = 
     "precision mediump float;" + 
     "uniform float Opacity;" + 
     "varying vec2 v_texCoords;" + 
     "uniform sampler2D u_baseMap;" + 
     "void main()" + 
     "{" + 
     "gl_FragColor = texture2D(u_baseMap, v_texCoords);" + 
     "gl_FragColor.a *= Opacity;"+    
     "}"; 

И тогда в моем методе визуализации:

//Enable and set mode 
    GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

//Draw 
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

//Disable 
GLES20.glDisable(GLES20.GL_BLEND); 

Таким образом, при максимальной прозрачности (0.0), это все хорошо, то есть ничто не обращается. Однако на любом другом уровне, это не совсем верно, например, при нулевой прозрачности (непрозрачность до 1,0), это то, что я получаю:

[введите описание изображения здесь] [1]

Но это надо! на самом деле выглядеть следующим образом:

[введите описание изображения здесь] [2]

цвета выглядит слишком темным, и (на исходном изображении), то очень немного темный край действительно выражен.

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

Я также попробовал найденное решение здесь:

https://gamedev.stackexchange.com/questions/7260/opengl-es-basic-fragment-shader-help-with-transparency

Но я получаю те же результаты?

Спасибо :-)

ответ

4

Во-первых, изменить ваш glBlendFunc к glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Rendering с непрозрачностью обрабатывается программой шейдера, который связан во время операции вытягивания выполняется после вызова glBlendFunc. Более конкретно, это определяется альфа-компонентом вывода gl_FragColor шейдера фрагмента связанной программы. Следующий фрагментарный шейдер показывает очень простой пример того, как вы могли бы использовать свою шейдерную программу для достижения эффекта затухания.

precision mediump float; 
uniform float Opacity; // range 0.0 to 1.0 
varying vec2 v_texCoords; 
uniform sampler2D u_baseMap; 

void main(void) 
{ 
    gl_FragColor = texture2D(u_baseMap, v_texCoords) ; 
    gl_FragColor.a *= Opacity; 
} 

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

Также: Не забудьте отключить состояние смешивания КАЖДОЕ время после рисования объектов переднего плана. В OpenGL всегда хорошая практика сбросить значение в прежнее состояние после завершения операции. Забыть сделать это может привести к серьезным головным болям.

+0

Спасибо за это, это очень ценится. Я редактировал свой вопрос, чтобы включить мои шейдеры. Пожалуйста, не могли бы вы показать, как я буду реализовывать это в своих шейдерах. Я все еще не на 100% понятен, потому что я использую текстуры - спасибо! – Zippy

+0

Пересмотренный. См. Редактирование, которое я сделал. –

+0

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