2012-04-24 4 views
0

Я попытался включить внимание, но это не сработало.OpenGL shader lssue

У меня диффузное, окружающее и зеркальное освещение. Мне просто нужно сгладить свет, когда фрагменты уйдут от света.

Кроме того, у меня есть параметр затухания для моего света:

glLightf (GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.0004f);

Это освещение пол, свет расположен позади куба:

http://oi43.tinypic.com/i39fuo.jpg

.vert

varying vec3 N; 
varying vec3 v; 
varying vec3 c; 
varying float dist; 

void main(void) 
{ 
vec4 ecPos; 
vec3 aux; 

ecPos = gl_ModelViewMatrix * gl_Vertex; 
aux = vec3(gl_LightSource[0].position-ecPos); 
dist = length(aux); 

c = vec3(gl_Color); 
v = vec3(gl_ModelViewMatrix * gl_Vertex);  
N = normalize(gl_NormalMatrix * gl_Normal); 
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

.frag

varying vec3 N; 
varying vec3 v; 
varying vec3 c;  
varying float dist; 

void main (void) 
{ 
float att; 

att = 1.0/(gl_LightSource[0].constantAttenuation + 
      gl_LightSource[0].linearAttenuation * dist + 
      gl_LightSource[0].quadraticAttenuation * dist * dist); 

vec3 L = normalize(gl_LightSource[0].position.xyz - v); 
vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0) 
vec3 R = normalize(-reflect(L,N));  

float nDotL = max(dot(N,L), 0.0); 
float rDotE = max(dot(R,E),0.0); 
float power = pow(rDotE, gl_FrontMaterial.shininess); 

//calculate Ambient Term: 
vec4 Iamb = gl_FrontLightProduct[0].ambient * att;   

//calculate Diffuse Term: 
vec4 Idiff = gl_FrontLightProduct[0].diffuse * nDotL * att; 
Idiff = clamp(Idiff, 0.0, 1.0);  

// calculate Specular Term: 
vec4 Ispec = gl_FrontLightProduct[0].specular * power * att; 
Ispec = clamp(Ispec, 0.0, 1.0); 

// write Total Color: 
gl_FragColor = Iamb + Idiff + Ispec + c; 
} 
+0

возможно дубликат [GLSL - Затухание не работает] (http://stackoverflow.com/questions/10241045/glsl-attenuation-not-working) –

ответ

0

С этого изображения я не могу ничего увидеть. Как установить небольшой объект в качестве источника света.

Какой объект использует этот шейдер?

Некоторые вещи, которые приходят на ум:

  1. Вы нормировать ваш нормальный в вашей вершинного шейдера, который является ненужным шагом.
    Переданные векторы от вершины к фрагментному шейдеру должны быть нормализованы внутри шейдера фрагмента, поскольку они будут интерполированы.
    Если вы не делаете никаких вычислений на основе длины в вашем вершинном шейдере, что вы не нормализуете, необходимо в вершинном шейдере.

    Вы должны нормализовать нормальный шейдер фрагмента, тогда вам не нужно нормализовать вектор отражения.

  2. Затухание основано не на чем-либо «сложном», рассчитанном в шейдере. Так выведите его, а затем проверьте остальные. Как выглядит ваш диффузный термин?

  3. Дополнительных советы:
    Вы можете разместить световой вектор и расчет затухания внутри вершинного шейдера и передать его, чтобы пиксельный шейдер (упаковать его в 4 VEC компоненты), чтобы сохранить интерполяторы.

  4. окончательный зеркальный зажим не требуется, значения должны быть в пределах диапазона [0, 1] автоматически. Если нет, у вас есть проблема.

+0

Вот видео YouTube вопроса. Просто замените текстурированную плоскость пола синим цветом, который вы видите на рисунке выше: http: //www.youtube.com/watch? V = Fp5HUeGaa-8 – user1337604

+0

Свет расположен сразу за зеленым кубом. – user1337604

+0

1.) Только пол использует шейдер в настоящее время. Я понял, что были бесполезные шаги, потому что я получил некоторые из шейдерного кода с веб-сайта. 2.) Я думал, что моя формула ослабления работает, и я не уверен, как отладить шейдер, так что я пришел сюда.Не уверен, что вы подразумеваете под диффузным термином, кроме того, который используется в шейдере // вычисляет Diffuse Term: vec4 Idiff = gl_FrontLightProduct [0] .diffuse * nDotL * att; Idiff = clamp (Idiff, 0.0, 1.0); 3.) Не 100% уверены, что вы имеете в виду, но я буду помнить об этом позже. – user1337604