WebGL detaches and removes shaders after linking

In OpenGL, it is recommended to disconnect and remove shaders after linking to the program ( Correct way to remove GLSL shaders? ).

But when I do this in WebGL, it looks like Safari and Firefox have problems (while Chrome behaves as expected). Does shaders separate and remove in WebGL, or are they just browser versions that are not standard?

The problem occurs when I use this function:

function setupShader(){
    var vertexShaderSrc = document.getElementById('vertexShader').textContent;
    var fragmentShaderSrc = document.getElementById('fragmentShader').textContent;
    var vertexShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);
    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
        alert(gl.getShaderInfoLog(vertexShader));
    }
    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragmentShader, fragmentShaderSrc);
    gl.compileShader(fragmentShader);
    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
        alert(gl.getShaderInfoLog(fragmentShader));
    }
    shaderProgram = gl.createProgram();
    gl.attachShader(shaderProgram, vertexShader);
    gl.attachShader(shaderProgram, fragmentShader);
    gl.linkProgram(shaderProgram);

    if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
        alert("Could not initialise shaders");
    }
    gl.useProgram(shaderProgram);
    gl.detachShader(shaderProgram, vertexShader);
    gl.detachShader(shaderProgram, fragmentShader);
    gl.deleteShader(vertexShader);
    gl.deleteShader(fragmentShader);    
}

A complete work example can be found here: http://jsfiddle.net/mortennobel/vdgtg3fy/1/

: : OS/X Yosemite. Safari 8.0, Chrome 39, Firefox 33.1. , gl.getUniformLocation(xxx) , , . , , , , , , , .

+4
1

, . , , -.

, WebGL, ES 2.0 .

ES 2.0 (. 31, UseProgram):

, , , . .

, . : " ". , " " , .

, " ". , UseProgram, , UseProgram. " " :

... UseProgram.

, , , , . .

1

// Build shaders, create program.
AttachShader(prog1, vs1);
AttachShader(prog1, fs1);
LinkProgram(prog1);

UseProgram(prog1);
DetachShader(prog1, vs1);
DetachShader(prog1, fs1);
// Program is still valid, and can continue to be used.

, , , spec, .

2

// Build shaders, create program.
AttachShader(prog1, vs1);
AttachShader(prog1, fs1);
LinkProgram(prog1);
DetachShader(prog1, vs1);
DetachShader(prog1, fs1);

UseProgram(prog1);
// Program is NOT valid!

DetachShader. , " " , " ".

3

// Build shaders, create program.
AttachShader(prog1, vs1);
AttachShader(prog1, fs1);
LinkProgram(prog1);

UseProgram(prog1);
DetachShader(prog1, vs1);
DetachShader(prog1, fs1);
// Program is still valid, and can continue to be used.

UseProgram(prog2);
// prog1 is now not "in use" anymore.
...

UseProgram(prog1);
// Is it valid? Probably not.

. prog1 , DetachShader. , , , . , , , .

+6

All Articles