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 の精度が、頂点シェーダーとフラグメント シェーダーの間で一致しません」
しかし、制服のどこが悪いのかわからない。