2016-01-14 2 views
0

При реализации затенения PhongModel. Зеркальный термин появляется с обеих сторон геометрии. Зеркальный термин вычисляется с использованием Half Vector.Phong - Half Vector Зеркальная сторона с обеих сторон

На переднем выходном изображении кажется, что он рассчитан правильно. Свет находится за камерой, и объект находится перед камерой.

[Свет ... Камера ... объект]

Но при переходе на другую сторону, даже если нет диффузного термина, я до сих пор получить блеск, который я не уверен, что я должен. На фотографиях следующих изображений объекты и свет находятся перед камерой, а свет находится за объектом.

[Камера ... объект ... свет]

Я подумал, что, может быть, если зеркальный по умноженному на знак (fLDotN)? Но результаты не кажутся прекрасными. Как обычно это делается?

Я думаю, что я

свет равномерное положение устанавливается в камере пространстве:

vec3 ptLightPos_CS=vec3(matLookAt*vec4(ptLightPos, 1)); 

Результат изображения с нормалей и halfvector: Phong Specular+Diffuse Results

VertexShader

// Input layouts 
in vec3 vertexPosition; 
in vec3 vertexNormal; 
in vec2 vertexTexCoord; 
in vec3 vertexTangent; 
in vec3 vertexBitangent; 

// Output layouts 

// Uniform variables 
uniform VertexUniforms 
{ 
    mat4 uniform_Projection; 
    mat4 uniform_ModelView; 
    mat4 uniform_NormalMatrix; 
}; 

// In variables 

// Out variables 
out vec2 vs_uv; 
out vec3 vs_normal; 
out vec3 vs_tangent; 
out vec3 vs_bitangent; 
out vec3 vs_pos; 
// Global variables 

/*************/ 

void main() 
{ 
    // Convert the vertex to clip space 
    vec3 vcPos=vec3(uniform_ModelView*vec4(vertexPosition, 1.0f)); 
    vec4 vertexProj = uniform_Projection * vec4(vcPos, 1.0f); 

    ///--- Tangent space 
    vs_normal=normalize(vec3(uniform_NormalMatrix * vec4(vertexNormal, 0))); 
    vs_tangent=normalize(vec3(uniform_NormalMatrix * vec4(vertexTangent, 0))); 
    vs_bitangent=normalize(vec3(uniform_NormalMatrix * vec4(vertexBitangent, 0))); 

    ///--- 
    vs_pos=vcPos; 

    // UV 
    vs_uv=vertexTexCoord; 

    gl_Position = vertexProj; 
} 

FragmentShader

// Output layouts 
out vec4 outColor; 

// Uniform variables 
uniform vec3 uniform_v3LightDiffuseColor; 
uniform vec3 uniform_v3LightSpecularColor; 
uniform sampler2D uniform_tDiffuse; 
uniform sampler2D uniform_tNormal; 
uniform vec3 uniform_v3LightPos; 

// In variables 
in vec2 vs_uv; 
in vec3 vs_normal; 
in vec3 vs_tangent; 
in vec3 vs_bitangent; 
in vec3 vs_pos; 
// Out variables 

// Global variables 

/*************/ 
#define PI 3.141592 

void main() 
{ 
    const vec3 T=normalize(vs_tangent); 
    const vec3 B=normalize(vs_bitangent); 
    const vec3 N=normalize(vs_normal); 
    const mat3 mTBN=mat3(T, B, N); 
    vec3 vNormal=mTBN*((texture2D(uniform_tNormal, vs_uv).xyz*2.0-1.0));  
    vNormal=normalize(vNormal); 

    const vec3 vEye=normalize(-vs_pos); 
    const vec3 vLightDir=normalize(uniform_v3LightPos-vs_pos); 
    const vec3 vLightDiffuse=vec3(0.5,0.5,0.5);//uniform_v3LightDiffuseColor; 
    const vec3 vLightSpecular=vec3(0.5,0.5,0.5);//uniform_v3LightSpecularColor; 
    const vec3 vMatDiffuse=vec3(0.5,0.5,0.5);//texture2D(uniform_tDiffuse, vs_uv).xyz; 
    const vec3 vMatSpecular=vMatDiffuse; 
    const float fMatSpecularPower=0.8; 
    const float fLDotN=max(dot(vLightDir, vNormal), 0); 

    //-- Diffuse 
    float fDiffuseContrib = fLDotN; 

    //-- Specular 
    vec3 v3HalfVect=normalize(vEye+vLightDir); 
    float fSpecularContrib=pow(clamp(dot(v3HalfVect, vNormal), 0.0, 1.0), fMatSpecularPower); 
    vec3 vDiffuse=fDiffuseContrib*vMatDiffuse*vLightDiffuse; 
    vec3 vSpecular=fSpecularContrib*vMatSpecular*vLightSpecular; 

    vec3 vcFinal=vDiffuse+vSpecular;  
    outColor = vec4(vcFinal, 1);  

    //outColor = vec4(vNormal.xyz, 1); 
    //outColor = vec4(vEye.xyz, 1); 
    //outColor = vec4(vLightDir.xyz, 1); 
    //outColor = vec4(v3HalfVect.xyz, 1); 
} 

ответ

0

Вы не вычислять зеркальное отражение if (dot(vNormal, vLightDir) < 0) и установить его в 0.

+2

Это означает, что вы не должны вычислять зеркальными, если у вас нет диффузного – Guiroux

Смежные вопросы