在opengl中绘制时改变灯光

时间:2012-11-15 10:31:05

标签: opengl graphics 3d rendering

关于一个主题我是最好的:说我有复杂的场景 和一盏灯,我可以通过发送绘图命令来绘制部分场景 后续的(例如100步)。

我可以在连续通话之间移动灯吗?例如我 将绘制表vith light0靠近它然后移动light0到 墙然后画墙然后移动light0到椅子然后画椅子。 那将有点像集合所有它是合法的 它不起作用,每个整个框架都应该有一盏灯 一个位置? (同样的问题也适用于其他属性) TNX

1 个答案:

答案 0 :(得分:1)

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

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 );

}

它是一个带纹理的着色器和一个无限遥远的指示灯。

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