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 に答える