OpenGL从Directional / point转换为Spotlight

时间:2015-05-08 04:53:46

标签: opengl glsl phong

所以我正在尝试在我的顶点着色器中创建一个聚光灯,目前我可以使用Phong照明模型生成方向和/或点光源。

我发现很难计算出聚光灯的正确角度,基本上只是想要一个来自眼睛空间0,0,0的聚光灯并俯视Z合作。

我试图让锥体中的所有东西(现在)变成亮白色,外面的一切都变暗了

# config/initializers/admin.rb
class CanAccessResque
  def self.matches?(request)
    current_user = request.env['warden'].user
    return false if current_user.blank?
    Ability.new(current_user).can? :manage, Resque
  end
end


# routes.rb
namespace :admin do
  constraints CanAccessResque do
    mount Resque::Server, at: 'resque'
  end
end

# ability.rb
class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new
    if user.is_admin?
      can :manage, Resque
    end
  end
end

# user.rb
class User < ActiveRecord::Base
  def is_admin?
    # your admin logic here for example:
    self.role == "admin"
  end
end

1 个答案:

答案 0 :(得分:1)

您的聚光灯由位置(ps)和方向(ds)定义。因此,对于位置vp处的每个顶点,您可以计算d = vp-ps,将其标准化为dn = normalize(d),然后dot(dn,ds)将为您提供聚光灯下的角度。只需缩放它或将其与截断值进行比较即可获得标量!

或者,从长远来看,更好的方法是将聚光灯视为相机。与您的相机一样:模型和视图矩阵!将每个顶点转换为该空间,并将其从x,y,z,w投影到x,y,z。 z是对于照明和x,y总是有用的距离,您可以使用它来查找具有圆形(或任何其他)的纹理。

使用这两种技术时要注意的一点是反投影:确保检查灯只指向前方!检查z或点积的符号!