私は頂点シェーダ "uIsTeapot"に変数を持っています。両方のシェーダーで一様な変数を表示する方法は?
uniform float uIsTeapot;
頂点シェーダは非常にうまく動作しますが、フラグメントシェイダーは表示されません。私は
if (uIsTeapot == 0.0)
を使用する場合は、エラーが
"uIsTeapot": undeclared identifier
を発生したが、私は頂点シェーダでそれを定義しました。私は制服のように両方のシェーダでuIsTeapotを定義する場合、プログラムは、プログラムが
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
が編集veryfication通過しないので、「シェーダを初期化できませんでした」と言う: 私はエラーなしでコンパイルされ、今変数やプログラムにmediumpを追加しますが、結果画面上の1つのオブジェクトですが、私は2つのオブジェクトを描画します。
頂点シェーダ
attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;
attribute vec2 aTextureCoord;
attribute vec4 aVertexColor;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
uniform mat3 uNMatrix;
uniform vec3 uAmbientColor;
uniform vec3 uPointLightingLocation;
uniform vec3 uPointLightingColor;
uniform mediump float uIsTeapot;
//varying float vIsTeapot;
varying vec2 vTextureCoord;
varying vec3 vLightWeighting;
varying vec4 vColor;
void main(void) {
if (uIsTeapot == 1.0) {
vec4 mvPosition = uMVMatrix * vec4(aVertexPosition, 1.0);
gl_Position = uPMatrix * mvPosition;
vec3 lightDirection = normalize(uPointLightingLocation - mvPosition.xyz);
vec3 transformedNormal = uNMatrix * aVertexNormal;
float directionalLightWeighting = max(dot(transformedNormal, lightDirection), 0.0);
directionalLightWeighting = 100.0;
vLightWeighting = uAmbientColor + uPointLightingColor * directionalLightWeighting;
vTextureCoord = aTextureCoord;
}
if (uIsTeapot == 0.0) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
} }
フラグメントシェーダあなたが同じ精度で、両方のシェーダでそれを宣言する必要があり
precision mediump float;
varying vec2 vTextureCoord;
varying vec3 vLightWeighting;
varying vec4 vColor;
uniform sampler2D uSampler;
uniform mediump float uIsTeapot;
//varying float vIsTeapot;
void main(void) {
if (uIsTeapot == 1.0) {
vec4 textureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(textureColor.rgb * vLightWeighting, textureColor.a);
} else {
gl_FragColor = vColor;
}
}
「プログラムが正しく動作しません」という情報が十分ではありません。どのようなエラーメッセージが表示されますか? [シェーダがコンパイルやリンクに失敗したときにシェーダ情報ログとプログラム情報ログを出力しますか?](http://webglfundamentals.org/webgl/lessons/webgl-boilerplate.html)? – gman
エラーが発生した場合の情報を追加しました – Log
コードは 'if(!gl.getProgramParameter(shaderProgram、gl.LINK_STATUS)){ alert(gl.getProgramInfoLog(shaderProgram)); } 'と同様です。また、' gl.getShaderInfoLog(shader) 'と' gl.getShaderParameter(shader、gl.COMPILE_STATUS) 'を呼び出すこと以外は、シェーダをコンパイルするときにも同様のコードが必要です。 – gman