1
私は現在、OpenGL/GLSLでPhong Lighting Modelを実装する課題を持っています。私が現在取り組んでいる2つのシェーダは以下の通りです。問題はフラグメントシェーダで、vColor
をgl_FragColor
に追加しないと、全体のシェイプが黒色になります。しかし、もし私がvColor
を追加すると、全体の形はまったく無色の色になります。私はこれを2時間ほど解決するように努力してきました。これの理由は何ですか?それは私のシェイダーの問題か、おそらくはOpenGLコードの問題でしょうか?シェーダの後に表示される1つの素材と1つの点光源を使用しています。Phong照明モデルは実際には何も照明していません
編集:私はgl_FragColor = vec4(N, 1.0)
を設定した場合、オブジェクトは、次のようになります。
頂点シェーダ:
#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);
}
編集後、法線が間違っているように見えます。法線を上にして飛行機のように非常にシンプルなものにシェイダーを使用しようとしましたか? – PeterT
可能性のあるデバッグを開始する必要があります。まず、ライティングユニフォームが画面に直接書き込むことで、正しく点灯していることを確認してください。 'gl_FragColor = ambient'などと同様です。次に、得られた法線が色の値として書き出すことで合理的であることを確認します。次に、どのドット(N、L)がそれを書いているのかを見てください。そして、あなたが意味をなさない部分を見つけるまで。 –