ОШИБКА:GL_INVALID_OPERATION: glUniform1iv: количество> 1 для фазера без массива 3.52

#shader #webgl #phaser-framework

#шейдер #webgl #фазер-фреймворк

Вопрос:

Фазер 3.52, не удается заставить шейдер работать: https://codesandbox.io/s/outlinepipeline-forked-o1jgo

Есть ошибка gl: [.WebGL-0x7fd99580aa00] ОШИБКА GL:GL_INVALID_OPERATION: glUniform1iv: количество> 1 для не массива

Ответ №1:

Есть два способа решить эту проблему. Во-первых, нужно использовать массив sampler2D, поскольку это то, что будет передаваться по многопроводной линии (и, я полагаю, источник этой ошибки GLSL)

         uniform sampler2D uMainSampler[2]; // This I believe can go up to 16, but the texture we want to use is at uMainSampler[1]
        // ...

        void main(void) 
        {
          vec4 texture = texture2D(uMainSampler[1], outTexCoord);
          // ...

          
          float upAlpha = texture2D(uMainSampler[1], outTexCoord   vec2(0.0, onePixel.y)).a;
          float leftAlpha = texture2D(uMainSampler[1], outTexCoord   vec2(-onePixel.x, 0.0)).a;
          float downAlpha = texture2D(uMainSampler[1], outTexCoord   vec2(0.0, -onePixel.y)).a;
          float rightAlpha = texture2D(uMainSampler[1], outTexCoord   vec2(onePixel.x, 0.0)).a;

          // ...

          gl_FragColor = color;
        }
 

Альтернативным (и, я думаю, более простым) решением было бы иметь OutlinePipeline расширение от Phaser.Renderer.WebGL.Pipelines.SinglePipeline вместо MultiPipeline .

Честно говоря, я не понимаю, почему в документах Phaser указано, что MultiPipeline является заменой TextureTintPipeline при создании собственного пользовательского конвейера, когда TextureTintPipelines изначально были конвейерами с одной текстурой. Я признаю, я все еще работаю над этими конвейерами, так что, возможно, я просто не понимаю чего-то очень простого.

Комментарии:

1. Большое спасибо! Я нашел эти плагины rexrainbow.github.io/phaser3-rex-notes/docs/site/shader-outline и они полностью решают мою проблему