2015-07-30 3 views
0

Я очень новичок в GLSL и начал с простого оттенка серого. Я использовал код урока GamesFromScratch в:GLSL Grayscale Shader удаляет прозрачность

vertexshader:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

Fragmentshader:

#ifdef GL_ES 
    precision mediump float; 
#endif 

varying vec4 v_color; 
varying vec2 v_texCoords; 
uniform sampler2D u_texture; 
uniform mat4 u_projTrans; 

void main() { 
     vec3 color = texture2D(u_texture, v_texCoords).rgb; 
     float gray = (color.r + color.g + color.b)/3.0; 
     vec3 grayscale = vec3(gray); 

     gl_FragColor = vec4(grayscale, 1.0); 
} 

эффект и проблема: все оказывается только в оттенках серого, но прозрачные части текстур становятся белый. Например: простой заполненный круг обычно рисуется как круг. Теперь его круг в белом ящике. Рядом с удаленными прозрачными частями изменения на альфе не видны.

+3

Вы устанавливаете альфа выходного сигнала на «1.0». Почему вы ожидаете увидеть прозрачность, если вы сделаете вывод полностью непрозрачным? –

+0

Несвязанный, но все, что связано с 'v_color', можно удалить из этого шейдера, поскольку оно не используется. – Tenfour04

ответ

4

Проблема в вашем шейдере фрагмента. Вы создаете представление vec3 color (r, g, b), затем вы устанавливаете gl_FragColor в vec4 (r, g, b, a). Используйте первые три цвета в оттенках серого, а затем установите «a» на твердое кодированное альфа-значение 1, удалив любую прозрачность.

Вы можете получить rgba из пробоотборника и использовать его альфу в финальном vec4.

Кроме того, если вы ищете более истинное преобразование в оттенках серого общий стандарта является

color = 0.299 * r + 0.587 * g + 0.114 * b

https://en.wikipedia.org/wiki/Grayscale

+0

Немного nitpicking: «Также, если вы ищете более истинное преобразование оттенков серого, общий стандарт ...». Здесь вы указываете преобразование RGB в Luma, как указано в ITU-R BT.601. Тем не менее, хорошая вещь о стандартах - это то, что они могут выбирать. Например, BT 701 использует (0.2126, 0.7152, 0.0722) иSMPTE 240M (0.212, 0.701, 0.087). Фактические коэффициенты будут зависеть от определения цветового пространства RGB, с которым вы работаете. – derhass

+0

спасибо, что помогает мне много. Не знаю, как я мог упустить эту часть. Теперь это выглядит довольно очевидно. Но проблема все еще существует: я часто использую 'sprite.draw (пакетный)' и измененный альфа. Поэтому нормально спрайты становятся прозрачными, но когда активируется шейдер, альфа-значение спрайта игнорируется. Также 'batch.setColor (Color.DARK_GRAY);' не имеет никакого эффекта при запуске шейдера –

1

Я думаю, что это изменение поможет вам.

vec4 color = texture2D(u_texture, v_texCoords); 
float gray = (color.r + color.g + color.b)/3.0; 
vec3 grayscale = vec3(gray); 

gl_FragColor = vec4(grayscale, color.a); 

В моих изменениях я читаю цвет с альфой из текстуры и применяю его для вывода.