链接程序时出现WebGL错误

WebGL Error in Linking Program

本文关键字:WebGL 错误 程序 链接      更新时间:2024-02-20

**更新**-我刚刚检查了它在Firefox中是否正常工作。确实如此。问题似乎在于Chromium如何处理WebGL。同样,请参阅下面的github链接。

我正在支持一个webgl/CV程序,当我注意到该网站开始从我没有接触过的代码中给出错误时。它抛出了一个错误,因为webgl程序没有正确链接。我觉得这很奇怪,因为当我最后一次接触这个项目的特定方面时(大约两个月前),它连接得很好。一些研究将我指向了这个链接:Github对问题的讨论

根据我的理解(如果我错了,请纠正我),有一个关于webgl如何处理不同类型变量的更新。我将发布着色器代码和使用它的函数,希望有人能指出一些我没有做过的测试。

this.createProgramObject = function(vetexShaderSource, fragmentShaderSource) {
        var vertexShaderObject = this.ctx.createShader(this.ctx.VERTEX_SHADER);
        this.ctx.shaderSource(vertexShaderObject, vetexShaderSource);
        this.ctx.compileShader(vertexShaderObject);
        if (!this.ctx.getShaderParameter(vertexShaderObject, this.ctx.COMPILE_STATUS)) {
            throw this.ctx.getShaderInfoLog(vertexShaderObject);
        }
        var fragmentShaderObject = this.ctx.createShader(this.ctx.FRAGMENT_SHADER);
        this.ctx.shaderSource(fragmentShaderObject, fragmentShaderSource);
        this.ctx.compileShader(fragmentShaderObject);
        if (!this.ctx.getShaderParameter(fragmentShaderObject, this.ctx.COMPILE_STATUS)) {
            throw this.ctx.getShaderInfoLog(fragmentShaderObject);
        }
        var programObject = this.ctx.createProgram();
        this.ctx.attachShader(programObject, vertexShaderObject);
        this.ctx.attachShader(programObject, fragmentShaderObject);
        this.ctx.linkProgram(programObject);
        if (!this.ctx.getProgramParameter(programObject, this.ctx.LINK_STATUS)) {
            throw ("Error linking shaders:" + this.ctx.getProgramInfoLog(programObject));
        }
        return programObject;
    };

在这个特定的调用中,函数使用point.vert和basic.frag.

点.vert

attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
uniform mat4 uModelViewMatrix;
uniform mat4 uProjectionMatrix;
uniform float uPointSize;
//for undetermined point attenuation feature
// uniform vec3 uAttenuation;
uniform vec3 uBias;
uniform vec3 uScale;
uniform int uCEMode;
varying vec4 vColor;
void main(void) {
    if(uCEMode == 1) {
        //use bias and scale unifroms for min max color enhancement
        vColor = (aVertexColor - vec4(uBias, 0.0)) * vec4(uScale, 1.0);
    }
    else {
        vColor = aVertexColor;
    }
    vec4 ecPos4 = uModelViewMatrix * vec4(aVertexPosition, 1.0);
    //make points larger as they get further away from the viewer
    //helps to make the cloud look less sparse when far enough to only see
    //the first level or two of the octree
    gl_PointSize = length(ecPos4) / uPointSize * 3.0;
    //for undetermined point attenuation feature
    // float attn = uAttenuation[0] + (uAttenuation[1] * dist) + (uAttenuation[2] * dist * dist);
    // gl_PointSize = (attn > 0.0 && attn < uPointSize) ? uPointSize * sqrt(1.0/attn) : uPointSize;
    gl_Position = uProjectionMatrix * ecPos4;
}

基本碎片

varying highp vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}

我能看到的vColor声明方式之间的唯一区别是highp说明符。如果我从basic.frag中删除它,它会显示"未捕获错误:0:1:'':没有为(float)指定精度"。如果我在point.vert中的声明中添加highp,则不会有任何变化。那么,我认为这个特定的说明符是好的。以下是Chrome中js控制台的错误消息:

Uncaught Error linking shaders:Varyings with the same name but different type, or statically used varyings in fragment shader are not declared in vertex shader: vColor

将其添加到片段着色器的顶部:

#ifdef GL_FRAGMENT_PRECISION_HIGH
   precision highp float;
#else
   precision mediump float;
#endif

然后从basic.frag.中删除"highp"

这也许可以,但我同意你给我们的信息不够确定。

-债券