GLSL: пример из предыдущего вывода, а не texture2D - PullRequest
0 голосов
/ 01 апреля 2019

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

У меня нормально работает sobel с помощью следующего скрипта

    vec4 colorSobel = texture2D(texture, uv);
    float bottomLeftIntensity = texture2D(texture, uv + vec2(-0.0015625, 0.0020833)).r;
    float topRightIntensity = texture2D(texture, uv + vec2(0.0015625, -0.0020833)).r;
    float topLeftIntensity = texture2D(texture, uv + vec2(-0.0015625, 0.0020833)).r;
    float bottomRightIntensity = texture2D(texture, uv + vec2(0.0015625, 0.0020833)).r;
    float leftIntensity = texture2D(texture, uv + vec2(-0.0015625, 0)).r;
    float rightIntensity = texture2D(texture, uv + vec2(0.0015625, 0)).r;
    float bottomIntensity = texture2D(texture, uv + vec2(0, 0.0020833)).r;
    float topIntensity = texture2D(texture, uv + vec2(0, -0.0020833)).r;
    float h = -secondary * topLeftIntensity - coef * topIntensity - secondary * topRightIntensity + secondary * bottomLeftIntensity + coef * bottomIntensity + secondary * bottomRightIntensity;
    float v = -secondary * bottomLeftIntensity - coef * leftIntensity - secondary * topLeftIntensity + secondary * bottomRightIntensity + coef * rightIntensity + secondary * topRightIntensity;

    float mag = length(vec2(h, v));
    //  alpha values removed atm
    if (mag < 0.5) {
        colorSobel.rgb *= (1.0 - 1.0);
        colorSobel.r += 0.0 * 1.0;
        colorSobel.g += 0.0 * 1.0;
        colorSobel.b += 0.0 * 1.0;
        colorSobel.rgb += 1.0 * mag;
    } else { 
        colorSobel.rgb *= (1.0 - 1.0);
        colorSobel.r += 0.0 * 1.0;
        colorSobel.g += 0.0 * 1.0;
        colorSobel.b += 0.0 * 1.0;
        colorSobel.rgb += 1.0 * mag;
    }
    gl_FragColor = colorSobel; 

Однако я знаю, что это работает путем выборки текстуры через texture2D.

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

  vec4 bg = texture2D(texture,uv);
  gl_FragColor = vec4(gb.rgb, 1.0);
  gl_FragColor.r = float(floor(gl_FragColor.r * 0.5 ) / 0.5);
  gl_FragColor.g = float(floor(gl_FragColor.g * 0.5 ) / 0.5);
  gl_FragColor.b = float(floor(gl_FragColor.b * 0.5 ) / 0.5);

Вывод по-прежнему выборки из текстуры и игнорирует первую краску.

Есть ли способ выборки из цветного вывода вместо использования texture2D? Причина, по которой я спрашиваю, состоит в том, что я запускаю свои шейдеры в зависимости от взаимодействия с пользователем?

...