2011-12-07 6 views
1

私は現在、OpenGL/GLSLでPhong Lighting Modelを実装する課題を持っています。私が現在取り組んでいる2つのシェーダは以下の通りです。問題はフラグメントシェーダで、vColorgl_FragColorに追加しないと、全体のシェイプが黒色になります。しかし、もし私がvColorを追加すると、全体の形はまったく無色の色になります。私はこれを2時間ほど解決するように努力してきました。これの理由は何ですか?それは私のシェイダーの問題か、おそらくはOpenGLコードの問題でしょうか?シェーダの後に表示される1つの素材と1つの点光源を使用しています。Phong照明モデルは実際には何も照明していません

編集:私はgl_FragColor = vec4(N, 1.0)を設定した場合、オブジェクトは、次のようになります。

enter image description here

頂点シェーダ:

#version 150 

in vec4 vPosition; 
in vec3 vNormal; 

uniform mat4 vMatrix; 
uniform vec4 LightPosition; 

out vec3 fNorm; 
out vec3 fEye; 
out vec3 fLight; 

void main() { 
    fNorm = vNormal; 
    fEye = vPosition.xyz; 
    fLight = LightPosition.xyz; 

    if(LightPosition.w != 0.0) { 
    fLight = LightPosition.xyz - vPosition.xyz; 
    } 

gl_Position = vMatrix * vPosition; 
} 

フラグメントシェーダ:

#version 150 

in vec3 fNorm; 
in vec3 fLight; 
in vec3 fEye; 

uniform vec4 vColor; 
uniform vec4 AmbientProduct, DiffuseProduct, SpecularProduct; 
uniform mat4 vMatrix; 
uniform vec4 LightPosition; 
uniform float Shininess; 

void main(){ 
    vec3 N = normalize(fNorm); 
    vec3 E = normalize(fEye); 
    vec3 L = normalize(fLight); 
    vec3 H = normalize(L + E); 

    vec4 ambient = AmbientProduct; 

    float Kd = max(dot(L, N), 0.0); 
    vec4 diffuse = Kd * DiffuseProduct; 

    float Ks = pow(max(dot(N, H), 0.0), Shininess); 
    vec4 specular = Ks * SpecularProduct; 
    if(dot(L,N) < 0.0) 
     specular = vec4(0.0, 0.0, 0.0, 1.0); 

    gl_FragColor = vColor + ambient + diffuse + specular; 
} 

設定材料と光:

void init() { 

    setMaterials(vec4(1.0, 0.0, 0.0, 0.0), //ambient 
      vec4(1.0, 0.8, 0.0, 1.0), //diffuse 
      vec4(1.0, 1.0, 1.0, 1.0), //specular 
      100.0); //shine 

    setLightSource(vec4(1.0, 0.0, 0.0, 1.0), //ambient 
       vec4(1.0, 0.0, 0.0, 1.0), //diffuse 
       vec4(1.0, 0.0, 0.0, 1.0), //specular 
       vec4(1.0, 2.0, 3.0, 1.0)); //position 

    setProducts(); 

    .... 
} 

/* 
* Sets the material properties for Phong lighting model. 
*/ 
void setMaterials(vec4 amb, vec4 dif, vec4 spec, GLfloat s) { 
    ambient = amb; 
    diffuse = dif; 
    specular = spec; 
    shine = s; 

    glUniform1f(vShininess, shine); 
} 

/* 
* Set light source properties. 
*/ 
void setLightSource(vec4 amb, vec4 dif, vec4 spec, vec4 pos) { 
    ambient0 = amb; 
    diffuse0 = dif; 
    specular0 = spec; 
    light0_pos = pos; 

    glUniform4fv(vLightPosition, 1, light0_pos); 
} 

/* 
* Find the products of materials components and light components. 
*/ 
void setProducts(){ 
    vec4 ambientProduct = ambient * ambient0; 
    vec4 diffuseProduct = diffuse * diffuse0; 
    vec4 specularProduct = specular * specular0; 

    glUniform4fv(vAmbientProduct, 1, ambientProduct); 
    glUniform4fv(vDiffuseProduct, 1, diffuseProduct); 
    glUniform4fv(vSpecularProduct, 1, specularProduct); 

} 
+0

編集後、法線が間違っているように見えます。法線を上にして飛行機のように非常にシンプルなものにシェイダーを使用しようとしましたか? – PeterT

+1

可能性のあるデバッグを開始する必要があります。まず、ライティングユニフォームが画面に直接書き込むことで、正しく点灯していることを確認してください。 'gl_FragColor = ambient'などと同様です。次に、得られた法線が色の値として書き出すことで合理的であることを確認します。次に、どのドット(N、L)がそれを書いているのかを見てください。そして、あなたが意味をなさない部分を見つけるまで。 –

答えて

0

最終的な照明用組成物は、右を見ていない:

gl_FragColor = vColor + ambient + diffuse + specular; 

それはすなわち、物体のアルベドによって変調された照明

gl_FragColor = vColor * (ambient + diffuse) + specular; 

のようなものでなければなりません。

関連する問題