2013-04-10 3 views
0

У меня есть точка света в моей сцене. Я думал, что это работает правильно, пока я не проверил его с камерой, глядя на освещенный объект под разными углами, и обнаружил, что область света движется по сетке (в моем случае простая плоскость). Я использую типичный подход к освещению Phong в ADS. Я преобразую светлое положение в пространство камеры на стороне клиента, а затем преобразую интерполированную вершину в вершинном шейдере с матрицей вида модели.Точка открытия OpenGL при повороте камеры

Моего вершинный шейдер выглядит следующим образом:

#version 420 

layout(location = 0) in vec4 position; 
layout(location = 1) in vec2 uvs; 
layout(location = 2) in vec3 normal; 

uniform mat4 MVP_MATRIX; 
uniform mat4 MODEL_VIEW_MATRIX; 
uniform mat4 VIEW_MATRIX; 
uniform mat3 NORMAL_MATRIX; 

uniform vec4 DIFFUSE_COLOR; 

//======= OUTS ============// 
out smooth vec2 uvsOut; 
out flat vec4 diffuseOut; 

out vec3 Position; 
out smooth vec3 Normal; 


out gl_PerVertex 
{ 
    vec4 gl_Position; 
}; 

void main() 
{ 
    uvsOut = uvs; 
    diffuseOut = DIFFUSE_COLOR; 
    Normal = normal; 
    Position = vec3(MODEL_VIEW_MATRIX * position); 

    gl_Position = MVP_MATRIX * position; 
} 

фрагмент шейдер:

//==================== Uniforms =============================== 
struct LightInfo{ 

vec4 Lp;///light position 
vec3 Li;///light intensity 
vec3 Lc;///light color 
int Lt;///light type 

}; 

const int MAX_LIGHTS=5; 

uniform LightInfo lights[1]; 


// material props: 
uniform vec3 KD; 
uniform vec3 KA; 
uniform vec3 KS; 
uniform float SHININESS; 
uniform int num_lights; 

////ADS lighting method : 

vec3 pointlightType(int lightIndex,vec3 position , vec3 normal) { 

    vec3 n = normalize(normal); 
    vec4 lMVPos = lights[0].Lp ; // 
    vec3 s = normalize(vec3(lMVPos.xyz) - position); //surf to light 
    vec3 v = normalize(vec3(-position)); // 
    vec3 r = normalize(- reflect(s , n)); 
    vec3 h = normalize(v+s); 

    float sDotN = max(0.0 , dot(s, n)); 

    vec3 diff = KD * lights[0].Lc * sDotN ; 
    diff = clamp(diff ,0.0 ,1.0); 

    vec3 spec = vec3(0,0,0); 

    if (sDotN > 0.0) { 
     spec = KS * pow(max(0.0 ,dot(n,h)) , SHININESS); 
     spec = clamp(spec ,0.0 ,1.0); 
    } 

    return lights[0].Li * (spec+diff); 
} 

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

glm::lookAt() 

, который всегда отрицает вектор «глаз», поэтому приходит, что матрица вида в моих шейдерах имеет отрицательную часть перевода. Предполагается, что это так? Может ли кто-нибудь дать подробное объяснение, как это делается в программируемом конвейере? Мои шейдеры реализованный на основе книге «OpenGL 4.0 Shading языка кулинарных» .The автор, кажется, также использовать камеру space.But не работает право, если это не так, как это должно работать ...

Я просто перевел вычисления в мировое пространство. Теперь точечный свет остается на месте. Но как я могу добиться того же, используя пространство камеры?

+0

Является ли ваш шейдер фрагмента также с помощью '#version 420'? – genpfault

+0

Да, конечно, никаких проблем с шейдерами, все мундиры и атрибуты в порядке. –

+0

Похоже, вы не превращаете свое нормальное пространство в камеру (используя матрицу MV, как и в случае с позицией). Может ли это быть проблема? –

ответ

1

Я пригвоздил ошибку, и это было довольно глупо. Но это может быть полезно для других, которые слишком «математичны». Моя светлая позиция в шейдерах определяется с помощью vec3. Теперь, на стороне клиента, это представленный с помощью vec4.Я фактически устанавливал компонент .w в vec4 равным нулю каждый раз, прежде чем преобразовывать его с матрицей вида. Так что, по-моему, вектор положения света не был правильно преобразован, и из этого все световое положение проблемы возникают в шейдере. Решение состоит в том, чтобы сохранить w-компонент вектора положения света всегда равным 1.

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