0

WebGL プロジェクトで GLSL シェーダーを使用しています。最近の Chrome の更新により、シェーダーがエラー メッセージなしでリンクされませんでした。この例のように、フラグメントシェーダーで「if」の条件としてユニフォームを使用すると、問題が発生します。

uniform int hasTexture;

void main(void) {
    if(hasTexture == 1) {
        // some code
    }
}

頂点シェーダーでは機能しますが、ここでユニフォームを使用しなければ機能します。

編集:これが私の問題が発生する完全なシェーダーです:

頂点シェーダー:

attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;
attribute vec2 aVertexTextureCoord;

uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
uniform mat3 uNMatrix;
uniform mat4 uMVMatrixCenter;

uniform vec3 uSunPosition;
uniform int hasTexture;

uniform int hasNormal;

varying float vLightLength;
varying float vSpecularLength;
varying vec2 vTextureCoord;

uniform float shininess;

uniform float sunPower;

void main(void) {

    vec4 inposition = uMVMatrix * vec4(aVertexPosition, 1.0);

    gl_Position = uPMatrix * inposition;


    if(hasNormal == 1) {

        vec4 transformedLocation = (uMVMatrixCenter * vec4(uSunPosition, 1.0));
        vec3 sunPosition = transformedLocation.xyz;

        vec3 lightDirection = normalize(sunPosition - inposition.xyz);

        vec3 transformedNormal = uNMatrix * aVertexNormal;

        vec3 normal = normalize(transformedNormal);
        vLightLength = max(dot(normal, lightDirection), 0.0)*sunPower;



        vec3 eyeDirection = normalize(-inposition.xyz);
        vec3 reflectionDirection = reflect(-lightDirection, normal);


        vSpecularLength = pow(max(dot(reflectionDirection, eyeDirection), 0.0), 32.0)*sunPower;

    }
    else {
        vLightLength = 1.0;
        vSpecularLength = 0.0;
    }

    if(hasTexture == 1)
        vTextureCoord = aVertexTextureCoord;

}

そして、ここにフラグメントシェーダーがあります:

#ifdef GL_ES
precision highp float;
#endif

varying float vLightLength;
varying float vSpecularLength;
varying vec2 vTextureCoord;

uniform sampler2D uSampler;
uniform int hasTexture;


uniform float ambiantIntensity;
uniform vec3 diffuseColor;
uniform vec3 emissiveColor;
uniform vec3 specularColor;
uniform float shininess;
uniform float transparency;

void main(void) {

    if(hasTexture == 1) {
        gl_FragColor = vec4(texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)).rgb*(
            emissiveColor*(1.0-vLightLength)
            +diffuseColor*vLightLength
            +specularColor*vSpecularLength*shininess), 1.0-transparency); // *vLightLength
    }
    else {
        gl_FragColor = vec4((emissiveColor*(1.0-vLightLength)
                            +diffuseColor*vLightLength
                            +specularColor*vSpecularLength*shininess), 1.0-transparency);
    }
}

そして、ここにそれらをコンパイルするコードがあります:

for(i=0;i<shaderNames.length;i++) {
    vertexShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vertexShader, shaderSourceList[i*2]);
    gl.compileShader(vertexShader);


    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
        alert(gl.getShaderInfoLog(vertexShader));
        return;
    }

    fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragmentShader, shaderSourceList[i*2+1]);
    gl.compileShader(fragmentShader);

    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
        alert(gl.getShaderInfoLog(fragmentShader));
        return;
    }

    shaderPrograms[i] = gl.createProgram();
    gl.attachShader(shaderPrograms[i], vertexShader);
    gl.attachShader(shaderPrograms[i], fragmentShader);
    gl.linkProgram(shaderPrograms[i]);

    if (!gl.getProgramParameter(shaderPrograms[i], gl.LINK_STATUS)) {
        alert("Could not initialise shader "+shaderNames[i]);
        return;
    }
}

ここで返されるエラーは、「シェーダーを初期化できませんでした」の後に名前が続きます。

コードから「if(hasTexture == 1) {」を削除すると、機能します。

編集 2: WebGL インスペクターをインストールしましたが、このバッファーのエラー メッセージが表示されます。

「均一な hasTexture の精度が、頂点シェーダーとフラグメント シェーダーの間で一致しません」

しかし、制服のどこが悪いのかわからない。

4

1 に答える 1