gpt4 book ai didi

带有 Cg 的 OpenGL 聚光灯

转载 作者:行者123 更新时间:2023-12-04 06:38:59 25 4
gpt4 key购买 nike

我正在尝试用 Cg 实现聚光灯效果。
我已经设法做正常的环境和漫射照明。

我了解聚光灯的基本功能(位置、方向、截止角度),但在 Cg 中处理这些仍然让我望而却步。

这就是我计算聚光灯参数的方式:

float4 dir_aux = mul(ModelViewProj, direction);
float4 lightP_aux = mul(ModelViewProj, lightPosition);

float3 lightP = lightP_aux.xyz;
float3 dir = normalize(dir_aux.xyz);

float3 P = IN.position;
float3 V = normalize(lightP - P);
dir = normalize(lightPosition - dir);

float angle = dot(V, dir);

方向是聚光灯指向的像素(例如: (0, 0, 0) )

lightPosition 是灯的位置

P 是我试图点亮的点。 IN.position 来自顶点着色器,它已经乘以modelViewProj。

角度是光的方向和从光到我试图照亮的点的方向之间夹角的余弦。

问题是改变光的方向不会影响聚光灯。它总是以 0,0,0 为中心。
如果我改变 lightPosition,聚光灯会改变,但它仍然从 0,0,0 开始并在灯光的位置相反的方向上扩展

另一件事是,当我计算方向向量时,我使用的是 lightPosition,而不是 lightP。如果我使用 lightP,则聚光灯根本不起作用。

此外,聚光灯只照亮了一半的场景。

我对此的主要引用是第 5 章(照明),来自 The Cg Tutorial .

最佳答案

这是我对此的看法,我认为您的向量指向错误的方向(当您进行减法时):

// direction is actually the location of the target
float4 target = direction; // renamed for clarity

float4 target_aux = mul(ModelViewProj, target);
float4 lightP_aux = mul(ModelViewProj, lightPosition);

float3 lightP = lightP_aux.xyz;
float3 targetXYZ = target.xyz;

// don't normalise this it's a location at this point, NOT a direction vector
//float3 dir = normalize(dir_aux.xyz);

float3 P = IN.position;
// reversed to give vector from light source to IN.Position
float3 V = normalize(P - lightP);

// reversed to give vector from light source to target
float3 dir = normalize(targetXYZ - lightP);

float angle = dot(V, dir);

有点晚了,但我希望有帮助:)

关于带有 Cg 的 OpenGL 聚光灯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com