在打开的GL中绘制时闪烁的灯光



我对一个主题很好奇:假设我有复杂的场景和一盏灯,我可以通过发送绘制命令将场景分成几部分按顺序(例如 100 步)。

我可以在顺序呼叫之间移动灯吗?例如我将表绘制 vith light0 靠近它,然后将 light0 移动到墙然后画墙,然后将 light0 移动到椅子上,然后画椅子。然后有点像组装这一切 这是合法的OT 它不起作用,每个整个帧都应该有一个灯一个职位?(同样的问题也适用于其他属性)TNX

当然,你可以。灯光位置只是传递给对象着色器的变量,如下所示:

uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;
uniform sampler2D baseMap;
varying vec2 Texcoord;
varying vec3 ViewDirection;
varying vec3 LightDirection; <------  here is your light position
varying vec3 Normal;
void main( void )
{
   vec3  fvLightDirection = normalize( LightDirection );
   vec3  fvNormal         = normalize( Normal );
   float fNDotL           = dot( fvNormal, fvLightDirection ); 
   vec3  fvReflection     = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection ); 
   vec3  fvViewDirection  = normalize( ViewDirection );
   float fRDotV           = max( 0.0, dot( fvReflection, fvViewDirection ) );
   vec4  fvBaseColor      = texture2D( baseMap, Texcoord );
   vec4  fvTotalAmbient   = fvAmbient * fvBaseColor; 
   vec4  fvTotalDiffuse   = fvDiffuse * fNDotL * fvBaseColor; 
   vec4  fvTotalSpecular  = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
   gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular );
}

它是一个带有纹理的着色器和一个无限遥远的点光源。

如果您需要在对象之间移动光源,则可以轻松渲染它,例如更改变量值。

相关内容

  • 没有找到相关文章

最新更新