- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我在使用 Phong 模型时遇到了问题,特别是漫反射分量以及使用正确的法 vector 和光 vector 的方向。这是一个学校项目,但我不在乎我是否没有完成它,只要有人能告诉我我做错了什么。我已经尝试了一些事情,我做的最好的事情就是让一半的大球体在错误的方向上进行遮蔽。最亮的强度位于半个圆圈的外边缘,当它向中心移动时会变暗,而实际上应该是相反的方向。当我看到看起来像在空心圆圈中着色的模型时,它看起来像在线条中对球体进行着色。
第二个球体的阴影可能很难看清。
相关结构:
struct Ray
{
vec3 origin; // origin of the ray
vec3 dir; // direction of the ray
};
struct Sphere
{
vec3 center;
float radius;
vec3 ka, kd, ks;
vec3 reflectivity;
float alpha;
Sphere(const vec3& ic=vec3(0.0f), const float& ir=0.0f, const vec3& ika=vec3(0.0f), const vec3& ikd=vec3(0.0f), const vec3& iks=vec3(0.0f), const float& ireflectivity=0.1f, const float& ialpha=1.0f):
center(ic), radius(ir), ka(ika), kd(ikd), ks(iks), reflectivity(ireflectivity), alpha(ialpha)
{}
bool intersect(const Ray& ray, float& t0, float& t1);
};
struct PointLight
{
vec3 location;
vec3 id, is;
PointLight(const vec3& iloc=vec3(0.0f), const vec3& iid=vec3(0.0f), const vec3& iis=vec3(0.0f)):
location(iloc), id(iid), is(iis)
{}
};
vec3 color;
vec3 amb = my_sphere.ka* my_ambient_light.ia; // I = ka * ia ambient component
int temp = my_point_lights.size() - 1;
color += amb;
vec3 diff;
for (int i = my_point_lights.size() - 1; i >= 0; i--) {
vec3 n = (ray.origin + ray.dir - my_sphere.center);
normalize(n);
vec3 L = (my_point_lights[temp].location - ray.origin);
normalize(L);
diff += my_sphere.kd * my_point_lights[temp].id * std::max(dot(n, L), 0.0f);
}
color += diff;
最佳答案
您基本上似乎想在着色器中做的是计算球体上给定点的漫反射着色。为此,您基本上需要两件事:首先,要着色的球体上那个点的表面法线,其次,光线落在要着色的点上的方向。现在,在您可以继续计算对象在给定点的着色之前,您通常需要知道要着色的特定点的实际位置。由于您没有真正提供任何解释,例如 ray.dir
之类的东西在您的代码中实际代表什么,我将不得不求助于猜测。我假设您正在做的是片段着色器中的某种光线跟踪。而且我必须假设 ray.dir
不仅仅是一些 vector ,指向在您感兴趣的点击中球体的射线的一般方向,但它实际上是 vector ,它将把你从射线的起点带到球体上的确切命中点。否则,您将缺少真正做任何事情的最基本信息,即您想要遮蔽的点的坐标。在这种情况下,您首先必须计算光线与球体的实际交点所在的位置。
现在,如果我们做出所有这些假设,并且我们进一步假设您拥有的所有这些 vector 实际上表示同一坐标系中的坐标,那么 ray.origin + ray.dir - my_sphere.center
确实应该产生一个从球体中心指向您想要遮蔽的点的 vector 。并且该 vector 确实应该指向您要着色的点处球体的表面法线方向。但是,计算漫反射着色所需的第二个 vector 是指向光线落在要着色的点上的方向的 vector 。即,从点到阴影指向光源的 vector 。但是,my_point_lights[temp].location - ray.origin
似乎是一个从光线原点指向光源的 vector 。
除此之外,可能应该引起您注意的是,与您的印象相反,函数 normalize(x)
不会修改您传递的 vector 一个论点。它只是返回另一个 vector ,该 vector 是您提供给它的任何 vector 的规范化版本。所以,很可能,你真正想写的是
n = normalize(n);
…
L = normalize(L);
此外,您在 color
和 diff
中累积值,但您从未将这些 vector 初始化为任何东西。您可能打算将它们初始化为零……😉
关于c++ - 光线追踪/Phong 模型漫反射组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678200/
我正在开发一个网站,在不使用任何第三方 API 的情况下使用 Firebase 云消息传递(Chrome 和 Firefox 浏览器)向我的订阅者发送推送通知。推送通知发送工作正常,但我不知道“如何跟
我在尝试追踪此 OutOfMemoryError 时遇到了非常糟糕的时间,非常感谢您的帮助。我的应用程序分为架构部分和一个模块,该模块公开一些基本的 REST WS 以及 Hibernate 进行的数
在 Android 操作系统源代码中(路径:/drivers/staging/android/binder_trace.h),我们有一个名为 binder_trace.h 的文件,并且在 /drive
我正在查看我的 CakePHP 应用程序的 error.log,并看到我定期收到此类信息: 2011-07-28 14:49:39 Warning: Warning (2): Missing argu
我收到了有关我的应用程序中内存泄漏的报告,但我无法准确追踪到底发生了什么。我有一个功能可以取出旧 View 并交换新 View 。我没有使用 NavControllers 或任何 @propertie
这是真气! >_< 我编写了一个庞大而复杂的 Haskell 库。我写了一个小测试程序,到目前为止,我已经花了大约 8 个小时试图弄清楚为什么它一直在我身上崩溃。有时 GHC 会提示“奇怪的封闭类型”
是否有系统的方法来调试导致组件在 React 中重新渲染的原因?我放置了一个简单的 console.log() 来查看它渲染了多少次,但我很难弄清楚是什么导致组件渲染多次,即在我的情况下(4 次)。是
我已经升级到 Django 1.4,现在当我运行我的开发服务器时,我收到以下警告: /home/flc/venvs/myprj/lib/python2.6/site-packages/django/v
我有一个 Web 应用程序在某处存在内存泄漏,但我无法检测到它。我已经尝试过 Chrome 开发者工具,通常效果很好,但我无法追踪负责的代码行。 Chrome 工具给了我太多信息,我无法将内存中的对象
直接从标记调用函数的好处之一是更容易跟踪所调用的内容。我想知道是否有浏览器插件或其他东西支持附加(绑定(bind))到元素的每个事件的“Goto javascript 源函数”。理想情况下,这会将我带
我在工作中使用 darcs 已经一年多了,但我一直在问自己同样的问题: 跟踪导致两个补丁之间依赖的代码行/文件/代码更改的最佳方法是什么?目前我的做法如下: 我使用 darcs changes -i
我知道以前有人问过此类问题,但我无法解决我的疑问。我有一个简单的黑白棋引擎(实际上它玩得很好),它使用下面的类来获得最佳棋步: import java.util.*; import java.util
上下文:我们正在构建用于快速交付 WPF 应用程序的框架。该框架使用 Autofac 作为 IoC 容器,还使用 Prism v1 中的区域。我们正在使用 Microsoft 的并行扩展来安排任务
有什么追踪东西的技巧吗?技术?任何可用于检查函数 x 的调用者的工具(调用堆栈的某些部分显示为 ??? 或被跳过)。 --track-origins=yes 是否会使速度变慢(当我尝试这样做时,我使用
我有一个基于 KnockoutJS 2.2.1 创建的 jQuery 网格插件。到目前为止它进展顺利,但是当插件在一个元素上初始化时,'computed' loadGrid 方法调用 3 次。 为了说
我是这种开发的新手。我正在尝试创建一个涉及 GPS 跟踪的 android 应用程序。我正在使用 Nutiteq,因为我必须使用 openstreetmap 作为默认 map 。请帮助我。 最佳答案
我希望用户能够通过我的应用程序之一跟踪他们的 friend 。该应用程序适用于音乐节。 我一直在想办法做到这一点: 让用户为设备设置昵称(与 UDID 关联),并让用户通过昵称将彼此添加到“好友列表”
有没有办法找到所有者或域名示例,如果我给谷歌的IP,我的工具发现谷歌的IP,这应该以编程方式完成地址最喜欢的编程语言将是VC++其他语言也不是问题 最佳答案 您正在寻找的关键字似乎是WHOIS 通常可
我的 VC++ 项目中有几个包含大量类的 map ,其中一些默认可构造,另一些则不能。尝试构建时,出现“没有合适的默认构造函数可用”错误。问题是错误被列为发生在 map.cpp 的第 173 行,这是
我平均工作(约 20k 行代码,Objective-C 与 C++ 混合),我正在努力寻找 EXC_BAD_ACCESS 错误。 我已经尝试了所有常见的技术(比如启用 NSZombie、guard e
我是一名优秀的程序员,十分优秀!