2012-04-24 110 views
0

我试图合并沉浸,但它失败了。OpenGL着色器发布

我有散射,环境和镜面照明工作。随着碎片离光线越来越远,我只需要调暗灯光。

此外,我拥有光衰减参数:

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) – 2012-04-24 01:48:10

回答

0

从这张图片我不能'真正看到任何东西。如何设置一个小物体作为光源。

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

浮现在我的脑海里有些东西:

  1. 你在你的顶点着色器,这是不必要的操作标准化正常的。
    从顶点到片段着色器传递的矢量必须在片段着色器内归一化,因为它们将被插值。
    只要你不在顶点着色器中进行任何基于长度的计算,在顶点着色器中你不需要规范化。

    你应该在片段着色器中标准化正常,然后你不需要规范化你的反射向量。

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

  3. 进一步提示:
    你可以将顶点着色器内部的光矢量和衰减计算,并将其传递作为片段着色器(它打包在一个4 VEC分量)来保存内插器。

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

+0

这是问题的YouTube视频。只需用上图中的蓝色替换纹理的地面飞机即可:http://www.youtube.com/watch?v = Fp5HUeGaa-8 – user1337604 2012-04-24 01:49:13

+0

灯光位于绿色立方体的后面。 – user1337604 2012-04-24 01:51:29

+0

1.)当前只有地板使用着色器。我意识到有没有用的步骤,因为我从网站上获得了一些着色器代码。 2.)我以为我的衰减公式正在工作,我不知道如何去着色器,所以我来到了这里。不知道你的意思是由漫射项,除了在着色器中使用的//计算漫反射项: vec4 Idiff = gl_FrontLightProduct [0] .diffuse * nDotL * att; 012iffIdiff = clamp(Idiff,0.0,1.0); 3.)不是100%确定你的意思,但我会在以后记住这一点。 – user1337604 2012-04-24 01:56:19