0

我试图加入衰减,但它失败了,什么也没做。

我有漫反射、环境和镜面照明工作。当碎片离光线越来越远时,我只需要调暗光线。

另外,我的灯有衰减参数:

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;   
}
4

1 回答 1

0

从这张图片中,我真的看不到任何东西。将一个小物体设置为光源怎么样?

哪个对象使用这个着色器?

我想到的一些事情:

  1. 您在顶点着色器中标准化了您的法线,这是一个不必要的步骤。
    从顶点传递到片段着色器的向量必须在片段着色器内部进行归一化,因为它们将被插值。
    只要您不在顶点着色器中进行任何基于长度的计算,在顶点着色器中就不需要进行标准化。

    您应该标准化片段着色器中的法线,然后您不需要标准化您的反射向量。

  2. 衰减不基于在着色器中计算的任何“复杂”。所以输出它,然后检查其余部分。你的漫反射词看起来如何?

  3. 进一步提示:
    您可以将光矢量和衰减计算放在顶点着色器中,并将其作为片段着色器传递(将其打包在 4 vec 组件中)以保存插值器。

  4. 最终的镜面钳位是不必要的,值应自动在 [0, 1] 范围内。如果不是你有问题。

于 2012-04-24T01:45:29.660 回答