2012-03-25 7 views
3

私は無用にフォンシェーディングを実装しようとしています。シェイダーをビットごとに構築しています(それ自体で問題になる可能性があります)が、現在私は現在どこにいるのですか。私は私の結果(ユタティーポット)を黒い背景に白いイメージとして出力すると期待しています。これは頂点シェーダから18行目を削除すると正しく実行されますが、その行に出力があり、エラーはありません。何か案は?GLSL Vertex Shaderは表示なしでコンパイルします

フラグメントシェーダ:

1 #version 120                      
    2                         
    3 varying vec3 vertexNormal;                   
    4 varying vec3 cameraSpacePos;                  
    5                         
    6 vec3 calcSpecular(vec3 l, vec3 n, vec3 v, vec3 cL, vec3 cS, float p)        
    7 {                         
    8  vec3 r = 2.0 * n * (n * l) - l;                
    9  return cL * cS * pow(max(0.0, dot(r, v)), p);             
10 }                         
11                         
12 vec3 calcDiffuse(vec3 l, vec3 n, vec3 cL, vec3 cD)             
13 {                         
14  return cL * cD * max(0.0, dot(n, l));               
15 }                         
16                         
17 void main(void)                     
18 {                         
19  vec3 lightDirection = normalize(vec3(-1.0, 0.0, -1.0));          
20  vec3 objectColor = vec3(0.5, 0.0, 0.0);              
21  vec3 ambientColor = vec3(0.1, 0.1, 0.1);              
22  vec3 lightColor  = vec3(0.3, 0.0, 0.3);              
23  vec3 specularColor = vec3(1.0, 1.0, 1.0);              
24                         
25  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);              
26 }     

バーテックスシェーダ:

1 #version 120 
    2 
    3 uniform mat4 modelView; 
    4 uniform mat4 normalModelView; 
    5 uniform mat4 projection; 
    6 
    7 attribute vec3 position; 
    8 attribute vec3 normal; 
    9 
10 varying vec3 vertexNormal; 
11 varying vec3 cameraSpacePos; 
12 
13 void main(void) 
14 { 
15  vec4 tmpCameraSpacePos = modelView * vec4(position, 1.0); 
16  gl_Position = projection * tmpCameraSpacePos; 
17 
18  vertexNormal = (normalModelView * vec4(normal, 0.0)).xyz; 
19  cameraSpacePos = (tmpCameraSpacePos).xyz; 
20 
21 } 
22 

また、正常とnormalModelViewが現在設定されていないことを言及する価値があるかもしれません。私は以前に同様の結果を得てそれらを試してみました。彼らはデフォルト値に設定されるべきだと私は理解しています。

+0

18行目でwを0.0または1.0に設定する必要がありますか? – user1118321

+1

@ user1118321法線はベクトルなので、翻訳はそれには適用されず、値は0でなければなりません。 – kevintodisco

+0

もちろん、ああ。いい視点ね。 – user1118321

答えて

1

normalnormalModelViewは設定されていないと言われていますので、どちらもデフォルト値に設定されておらず、技術的に無効なデータです。シェーダで無効なデータが使用されると、結果は定義されず、シェーダがデバッグするのが難しい理由の一部です。コード内でそれらの変数を参照しようとする前に、それらの変数の値を提供していることを確認してください。

+0

それは問題だった。私は以前にその動作が定義されていることを(少なくとも行列については)知っていたと思っていましたが、それが問題になっていました。 – Kyle

関連する問題