我对一个主题感到好奇:假设我有复杂的场景和一盏灯,我可以通过顺序发送绘制命令(例如以 100 步)来部分绘制场景。
我可以在连续调用之间移动灯吗?例如,我会在靠近它的地方绘制带有 light0 的桌子,然后将 light0 移到墙上,然后画墙,然后将 light0 移到椅子上,然后画椅子。这会有点像组装这一切它是合法的,它不会工作,每个整个框架都应该在一个位置有一个灯?(同样的问题也适用于其他属性) 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 );
}
它是一个具有纹理的着色器和一个无限远的点光源。
如果您需要在对象之间移动光源,则可以轻松更改变量值。