2014-12-02 5 views
0

У меня возникли проблемы с моим зеркальным освещением, у меня есть окружающая среда и рассеянность, но теперь я смотрю на зеркало, чтобы попробовать сделать красивую модель.Проблема с зеркальным освещением в OpenGL

У меня есть следующие в моем vertexShader:

#version 330 

layout (location = 0) in vec3 Position; 
layout (location = 1) in vec3 Normal; 

out vec4 Colour0; 

// Transforms 
uniform mat4 gModelToWorldTransform; 
uniform mat4 gWorldToViewToProjectionTransform; 

// Ambient light parameters 
uniform vec3 gAmbientLightIntensity; 

// Directional light parameters 
uniform vec3 gDirectionalLightIntensity; 
uniform vec3 gDirectionalLightDirection; 

// Material constants 
uniform float gKa; 
uniform float gKd; 
uniform float gKs; 
uniform float gKsStrength; 


void main() 
{ 
    // Transform the vertex from local space to homogeneous clip space 
    vec4 vertexPositionInModelSpace = vec4(Position, 1); 
    vec4 vertexInWorldSpace = gModelToWorldTransform * vertexPositionInModelSpace; 
    vec4 vertexInHomogeneousClipSpace = gWorldToViewToProjectionTransform * vertexInWorldSpace; 
    gl_Position = vertexInHomogeneousClipSpace; 

    // Calculate the directional light intensity at the vertex 
    // Find the normal in world space and normalise it 
    vec3 normalInWorldSpace = (gModelToWorldTransform * vec4(Normal, 0.0)).xyz; 
    normalInWorldSpace = normalize(normalInWorldSpace); 

    // Calculate the ambient light intensity at the vertex 
    // Ia = Ka * ambientLightIntensity 
    vec4 ambientLightIntensity = gKa * vec4(gAmbientLightIntensity, 1.0); 

    // Setup the light direction and normalise it 
    vec3 lightDirection = normalize(-gDirectionalLightDirection); 

    //lightDirection = normalize(gDirectionalLightDirection); 
    // Id = kd * lightItensity * N.L 
    // Calculate N.L 
    float diffuseFactor = dot(normalInWorldSpace, lightDirection); 
    diffuseFactor = clamp(diffuseFactor, 0.0, 1.0); 

    // N.L * light source colour * intensity 
    vec4 diffuseLightIntensity = gKd * vec4(gDirectionalLightIntensity, 1.0f) * diffuseFactor; 

    vec3 lightReflect = normalize(reflect(gDirectionalLightDirection, Normal)); 

    //Calculate the specular light intensity at the vertex 
    float specularFactor = dot(normalInWorldSpace, lightReflect); 
    specularFactor = pow(specularFactor, gKsStrength); 
    vec4 specularLightIntensity = gKs * vec4(gDirectionalLightIntensity, 1.0f) * specularFactor; 

    // Final vertex colour is the product of the vertex colour 
    // and the total light intensity at the vertex 

    vec4 colour = vec4(0.0, 1.0, 0.0, 1.0); 
    Colour0 = colour * (ambientLightIntensity + diffuseLightIntensity + specularLightIntensity); 
} 

Тогда в моей main.cpp У меня есть некоторый код, чтобы попытаться получить эту работу вместе, зеркальная свет, безусловно, делает что-то, только вместо делая модель блестящей, она, кажется, усиливает свет до такой степени, что я не вижу никаких подробностей.

создать следующие переменные:

// Lighting uniforms location 

GLuint gAmbientLightIntensityLoc; 
GLuint gDirectionalLightIntensityLoc; 
GLuint gDirectionalLightDirectionLoc; 
GLuint gSpecularLightIntensityLoc; 

// Materials uniform location 
GLuint gKaLoc; 
GLuint gKdLoc; 
GLuint gKsLoc; 
GLuint gKsStrengthLoc; 

Затем я мои переменные как и в функции renderSceneCallBack(), которая называется в основном:

// Set the material properties 
glUniform1f(gKaLoc, 0.2f); 
glUniform1f(gKdLoc, 0.9f); 
glUniform1f(gKsLoc, 0.5f); 
glUniform1f(gKsStrengthLoc, 0.5f); 

Я затем создать initLights() функцию, которую я хотел бы обращаться со всем освещением, это также называется в основном:

static void initLights() 
{ 
    // Setup the ambient light 
    vec3 ambientLightIntensity = vec3(0.2f, 0.2f, 0.2f); 
    glUniform3fv(gAmbientLightIntensityLoc, 1, &ambientLightIntensity[0]); 

    // Setup the direactional light 
    vec3 directionalLightDirection = vec3(0.0f, 0.0f, -1.0f); 
    normalize(directionalLightDirection); 
    glUniform3fv(gDirectionalLightDirectionLoc, 1, &directionalLightDirection[0]); 

    vec3 directionalLightIntensity = vec3(0.8f, 0.8f, 0.8f); 
    glUniform3fv(gDirectionalLightIntensityLoc, 1, &directionalLightIntensity[0]); 

    //Setup the specular Light 
    vec3 specularLightIntensity = vec3(0.5f, 0.5f, 0.5f); 
    glUniform3fv(gSpecularLightIntensityLoc, 1, &specularLightIntensity[0]); 
} 

Может ли кто-нибудь увидеть, что я могу делать неправильно, я мог бы ошибаться в некоторых вычислениях, и я просто этого не вижу. И окружающее/диффузное освещение работают правильно. На этой фотографии показано, что происходит в настоящее время, эмбиент слева, рассеивается посередине и зеркальный с силой, установленной на 30 справа.

enter image description here

Ответ

Я забыл передать это значение в основной:

gKsStrengthLoc = glGetUniformLocation(shaderProgram, "gKsStrength"); 
    //assert(gDirectionalLightDirectionLoc != 0xFFFFFFFF); 

Все работает теперь использует ответ выбран

+1

Еще один комментарий - обычно, зеркальный свет не умножает цвет объекта, а вместо этого он добавляется к результирующему цвету как цвет света, умноженный на вашу зеркальную интенсивность. Итак, для белого света ваша зеркальная подсветка должна быть белой, а не зеленой. – vesan

ответ

3

Ваше значение для gKsStrength выглядит слишком мал :

glUniform1f(gKsStrengthLoc, 0.5f); 

Это значение определяет, насколько близок объект, с более высокими значениями, делая его более блестящим. Это имеет смысл, если вы посмотрите на расчете затенения:

specularFactor = pow(specularFactor, gKsStrength); 

Чем больше показателя, тем быстрее падает значение, что означает, что зеркальный момент становится более узким.

Типичные значения могут быть примерно 10.0f для умеренно блестящих, 30.0f для довольно блестящих и даже более высоких для очень блестящих материалов.

С вашей стоимостью 0.5f вы получаете очень широкую зеркальную «подсветку». Ваше значение для интенсивности зеркал также довольно велико (0,5), поэтому подсветка будет охватывать большую часть объекта и насыщает цвета для больших частей.

+0

Спасибо за вход, я играл с этим значением и, похоже, делает объект более ярким, а не блестящим, это правильный эффект?Я добавил фотографию, чтобы продемонстрировать свое освещение. – user2757842

+0

Моя вина, я забыл сделать ссылку на gksStrengthLoc в основном, вы были правы, сэр, спасибо, я обновил свою ошибку в вопросе – user2757842