私は現在、glslを使ってPhongモデルを使って球上に鏡面照明を作ろうとしています。 sunPositionが動いていないと値(2.0f、3.0F、-1.0f)に設定されているglsl(lwjgl)のフォンスペキュラライティング
#version 120
uniform vec4 color;
uniform vec3 sunPosition;
uniform mat4 normalMatrix;
uniform mat4 modelViewMatrix;
uniform float shininess;
// uniform vec4 lightSpecular;
// uniform vec4 materialSpecular;
varying vec3 viewSpaceNormal;
varying vec3 viewSpacePosition;
vec4 calculateSpecular(vec3 l, vec3 n, vec3 v, vec4 specularLight, vec4 materialSpecular) {
vec3 r = -l+2*(n*l)*n;
return specularLight * materialSpecular * pow(max(0,dot(r, v)), shininess);
}
void main(){
vec3 normal = normalize(viewSpaceNormal);
vec3 viewSpacePosition = (modelViewMatrix * vec4(gl_FragCoord.x, gl_FragCoord.y, gl_FragCoord.z, 1.0)).xyz;
vec4 specular = calculateSpecular(sunPosition, normal, viewSpacePosition, vec4(0.3,0.3,0.3,0.3), vec4(0.3,0.3,0.3,0.3));
gl_FragColor = color+specular;
}
:
これは私のフラグメントシェーダがどのように見えるかです。
鏡面の計算が正しければ、画像は何も表示されません。私が最初に取り組ん鏡面反射光の一部を取得したいので、私はこのコードで任意のambient-/emissiv-/deffuse-照明を持っていない理由がある http://i.imgur.com/Na2C6.png
:これは、それがどのように見えるかです
。
ありがとうございました!
編集:それはまだ右ではない何かをする縫い目たくさんの厳しい助けindead @Darcyレイナー ...
現在のコードは次のようになります。
バーテックスシェーダ:
viewSpacePosition = (modelViewMatrix*gl_Vertex).xyz;
viewSpaceSunPosition = (modelViewMatrix*vec4(sunPosition,1)).xyz;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
viewSpaceNormal = (normalMatrix * vec4(gl_Position.xyz, 0.0)).xyz;
フラグメントシェーダ:
vec4 calculateSpecular(vec3 l, vec3 n, vec3 v, vec4 specularLight, vec4 materialSpecular) {
vec3 r = -l+2*(n*l)*n;
return specularLight * materialSpecular * pow(max(0,dot(r, v)), shininess);
}
void main(){
vec3 normal = normalize(viewSpaceNormal);
vec3 viewSpacePosition = normalize(viewSpacePosition);
vec3 viewSpaceSunPosition = normalize(viewSpaceSunPosition);
vec4 specular = calculateSpecular(viewSpaceSunPosition, normal, viewSpacePosition, vec4(0.7,0.7,0.7,1.0), vec4(0.6,0.6,0.6,1.0));
gl_FragColor = color+specular;
}
は、そして球は次のようになります。太陽の位置と
:sunPosition =新しいベクトル(12.0f、15.0f、-1.0f)。