GLSL Shader Нежелательный эффект градаций серого

Позвольте мне предварить это тем фактом, что я новичок в GLSL.

Я пытаюсь использовать шейдер, чтобы добавить эффект размытия к символам барабанов слотов во время их вращения. У меня работает рабочий эффект размытия, который я закомментировал просто для простоты и изолирования этой проблемы.

Вершинный шейдер:

//Vertex Shader
attribute vec4 position;
attribute vec4 inColor;
attribute vec2 inUV;

//To be passed to the Fragment Shader "BlurShader.fsh"
varying vec4 colorVarying;
varying vec2 uvOut;

void main()
{
    colorVarying = inColor;
    gl_Position = position;
    uvOut = inUV;
}

Фрагментный шейдер:

//Fragment Shader

uniform sampler2D tex0;

//Passed from Vertex Shader "BlurShader.vsh"
varying vec4 colorVarying; //ISSUE: this is always solid white
varying vec2 uvOut;

//This is the intensity of the blur. Higher is a larger blur
//  25 is a good starting point
//  Could possibly make it a varible to be passed in to control directly from Lua
#define INTENSITY 25.0

vec4 BlurVertical(vec2 size, vec2 uv, float radius) {
    if (radius >= 1.0)
    {
        vec4 C = vec4(0.0); 
        float height = 1.0 / size.y;
        float divisor = 0.0; 

        for (float y = -radius; y <= radius; y++)
        {
            C += texture(tex0, uv + vec2(0.0, y * height));
            divisor++; 
        }
        return vec4(C.r / divisor, C.g / divisor, C.b / divisor, 1.0);
    }
    return texture2D(tex0, uv);
}

void main()
{
    //Apply blur to final output
    //gl_FragColor = BlurVertical(textureSize(tex0, 0), uvOut, INTENSITY);
    //gl_FragColor = texture2D(tex0, uvOut) * colorVarying; SAME RESULT
    gl_FragColor = texture2D(tex0, uvOut);
}

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

Странный эффект оттенков серого

Как это должно выглядеть

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


person Brett Weiss    schedule 30.01.2019    source источник
comment
Как вы загружаете текстуру в GPU?   -  person Rabbid76    schedule 30.01.2019
comment
Я не совсем уверен. Я работаю с большой базой кода C ++, которую я не понимаю, у которой есть функция, которая должна это делать   -  person Brett Weiss    schedule 30.01.2019
comment
Есть ли где-нибудь вызов glTexImage2D и какие параметры?   -  person Rabbid76    schedule 31.01.2019
comment
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, ширина, высота, 0, GL_RGBA, GL_UNSIGNED_BYTE, буфер)   -  person Brett Weiss    schedule 31.01.2019
comment
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, ширина, высота, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, tmpbuf)   -  person Brett Weiss    schedule 31.01.2019
comment
Я не уверен, какой из них, но это единственные 2 во всем решении. Я сейчас пытаюсь понять, что один из них выполнен   -  person Brett Weiss    schedule 31.01.2019
comment
Когда я заменяю второй на GL_RGBA вместо GL_LUMINANCE, это имеет катастрофический эффект (текстуры перемешиваются), и в символах все еще сохраняется тот же эффект оттенков серого.   -  person Brett Weiss    schedule 31.01.2019
comment
Да, проблема в GL_LUMINANCE. Это должно быть GL_RGBA, но этого недостаточно. tmpbuf выглядит как изображение в оттенках серого. Это должно быть изображение в формате RGBA.   -  person Rabbid76    schedule 31.01.2019


Ответы (1)


Нашел решение! Текстура, которую я использовал, была закодирована в YUVA, поэтому на самом деле мне нужно было выбрать 4 текстуры, а затем преобразовать их в один RGBA.

uniform sampler2D tex[4];

vec4 YUVAtoRGBA() 
{
    mat4 xForm = mat4(
        1.164, 1.164, 1.164, 0.0,
        0.0, -0.391, 2.018, 0.0,
        1.596, -0.813, 0.0, 0.0,
        0.0, 0.0, 0.0, 1.0);

    vec4 yuva = vec4(
        texture2D(tex[0], (uvOut.xy / uvOut.z).x - 0.0625,
        texture2D(tex[1], (uvOut.xy / uvOut.z).x - 0.5,
        texture2D(tex[2], (uvOut.xy / uvOut.z).x - 0.5,
        texture2D(tex[3], (uvOut.xy / uvOut.z).x);

    return colorVarying * (xForm * yuva);
}
person Brett Weiss    schedule 30.01.2019