#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 и они полностью решают мою проблему