2016-10-10 5 views
-2

私は頂点シェーダ "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; 
    } 


} 
+0

「プログラムが正しく動作しません」という情報が十分ではありません。どのようなエラーメッセージが表示されますか? [シェーダがコンパイルやリンクに失敗したときにシェーダ情報ログとプログラム情報ログを出力しますか?](http://webglfundamentals.org/webgl/lessons/webgl-boilerplate.html)? – gman

+0

エラーが発生した場合の情報を追加しました – Log

+0

コードは 'if(!gl.getProgramParameter(shaderProgram、gl.LINK_STATUS)){ alert(gl.getProgramInfoLog(shaderProgram)); } 'と同様です。また、' gl.getShaderInfoLog(shader) 'と' gl.getShaderParameter(shader、gl.COMPILE_STATUS) 'を呼び出すこと以外は、シェーダをコンパイルするときにも同様のコードが必要です。 – gman

答えて

1

。その後、プログラムが正しく動作しません

するとはどういう意味ですか。

+0

"initShaders"の部分のエラー – Log

+0

私は質問のいくつかの情報を追加します – Log

1

頂点シェーダーとフラグメントシェーダーを投稿できますか?

uniform mediump float uIsTeapot;

...両方で:

使用してみてください、私はあなたがデフォルトの精度に依存している疑いがある、あなたがフラグメントシェーダで頂点シェーダとmediumpにhighp使用している可能性があります頂点シェーダとフラグメントシェーダ。

+0

ありがとう、initShadersのエラーがなくなったが、私は2つのオブジェクトを描画するが、画面上に1つだけのオブジェクトがあります。なぜあなたは1つのオブジェクトしか知りませんか? – Log

関連する問題