pex-gl / pex-context

Modern WebGL state wrapper for PEX: allocate GPU resources (textures, buffers), setup state pipelines and passes, and combine them into commands.
http://pex-gl.github.io/pex-context/
MIT License
160 stars 12 forks source link

Invalid scissor when rendering to fbo #88

Open vorg opened 3 years ago

vorg commented 3 years ago

A correct viewport will be set if not provided but rendering to a texture but scissor is not. https://github.com/pex-gl/pex-context/blob/master/index.js#L533

if (!cmd.viewport && cmd.pass && cmd.pass.opts.color) {
        let tex = null
        if (cmd.pass.opts.color[0]) {
          tex = cmd.pass.opts.color[0].texture || cmd.pass.opts.color[0]
        }
        if (cmd.pass.opts.depth) {
          tex = cmd.pass.opts.depth.texture || cmd.pass.opts.depth
        }
        if (tex) {
          newCmd.viewport = [0, 0, tex.width, tex.height]
        }
      }

Other things to test:

Scissor and viewport stacking in subcommands

Should we apply parent scissor if child command overwrote it and we finished rendering? https://github.com/pex-gl/pex-context/blob/master/index.js#L1019

if (cmd.scissor !== state.scissor) {
          state.scissor = cmd.scissor
          gl.disable(gl.SCISSOR_TEST)
        }

Same for viewport https://github.com/pex-gl/pex-context/blob/master/index.js#L1029

if (cmd.viewport) {
        if (cmd.viewport !== state.viewport) {
          state.viewport = cmd.viewport
          gl.viewport(
            state.viewport[0],
            state.viewport[1],
            state.viewport[2],
            state.viewport[3]
          )
        }
      }