OpenGL: перекрывающиеся 2 текстуры без белого смешения - PullRequest
0 голосов
/ 26 марта 2019

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

результат, который я хочу, и 2 текущих результата:

img

Edit1: в моем художественном стиле у меня есть 1 текстура на плоскость. чтобы создать иллюзию толщины каждой плоскости, мне нужно нарисовать ее 2 раза с расстоянием в один пиксель.

иллюстрации:

img

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

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

```
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform float shxx;
uniform float shyy;

void main()
{
    vec2 Coord1 = v_vTexcoord + vec2(0,0);
    vec2 Coord2 = v_vTexcoord + vec2(shxx,shyy);
    vec2 Coord3 = v_vTexcoord + vec2(shxx+shxx,shyy+shyy);
    vec2 Coord4 = v_vTexcoord + vec2(+shxx+shxx+shxx,+shyy+shyy+shyy);

    gl_FragColor = v_vColour * texture2D( gm_BaseTexture, Coord1)
        - v_vColour * texture2D( gm_BaseTexture, Coord2) 
        + v_vColour * texture2D( gm_BaseTexture, Coord2)
        - v_vColour * texture2D( gm_BaseTexture, Coord3)  
        + v_vColour * texture2D( gm_BaseTexture, Coord3)
        - v_vColour * texture2D( gm_BaseTexture, Coord4) 
        + v_vColour * texture2D( gm_BaseTexture, Coord4);
}
```

1 Ответ

0 голосов
/ 26 марта 2019

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

Конечный результат = https://i.imgur.com/aexqIts.png

varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform float shxx;
uniform float shyy;


void main()
{
    vec2 Coord1 = v_vTexcoord + vec2(0,0);
    vec2 Coord2 = v_vTexcoord + vec2(shxx,shyy);
    vec2 Coord3 = v_vTexcoord + vec2(shxx+shxx,shyy+shyy);
    vec2 Coord4 = v_vTexcoord + vec2(+shxx+shxx+shxx,+shyy+shyy+shyy);
    vec2 Coord5 = v_vTexcoord + vec2(+shxx+shxx+shxx+shxx,+shyy+shyy+shyy+shyy);    

    gl_FragColor =  v_vColour * texture2D( gm_BaseTexture, Coord1)
    -  texture2D( gm_BaseTexture, Coord2)*0.9;
    if( gl_FragColor.a < 0.9 ) gl_FragColor = vec4(0.0,0.0,0.0,0.0);

    gl_FragColor += v_vColour * texture2D( gm_BaseTexture, Coord2)
    -  texture2D( gm_BaseTexture, Coord3)*0.9;
    if( gl_FragColor.a < 0.9 ) gl_FragColor = vec4(0.0,0.0,0.0,0.0);

    gl_FragColor += v_vColour * texture2D( gm_BaseTexture, Coord3)
    -  texture2D( gm_BaseTexture, Coord4)*0.9;
    if( gl_FragColor.a < 0.9 ) gl_FragColor = vec4(0.0,0.0,0.0,0.0);

    gl_FragColor += v_vColour * texture2D( gm_BaseTexture, Coord4)
    -  texture2D( gm_BaseTexture, Coord5)*0.9;
    if( gl_FragColor.a < 0.9 ) gl_FragColor = vec4(0.0,0.0,0.0,0.0);

    gl_FragColor += v_vColour * texture2D( gm_BaseTexture, Coord5);
}
...