我在几场比赛中看到了纹理良好的球,行星和其他球形物体,上次在不明飞行物:后果.如果你只是将纹理溅入纬度/经度作为你和w -coordinates你会得到很多丑陋的纹理扭曲到两极.
我认为自己是一种实现具有最小失真的球形地图的方法.通过三角形而不是正方形映射.但我不知道任何算法.如何为这样的球体生成顶点和纹理坐标?
此外,我没有看到从简单的扁平方形图生成完整球形贴图的方法.绘制这样的地图有没有直观的方法没有真正的麻烦?
但是,有没有其他算法来渲染没有或具有最小失真的球体?
光线跟踪和光栅化算法都很有趣.
我已经使用以(0,0,0)为中心并直接观察球体原始的相机实现了Phong照明方案.以下是场景文件的相关内容,用于使用OpenGL查看场景以及使用我自己的实现渲染场景:
ambient 0 1 0
dir_light 1 1 1 -3 -4 -5
# A red sphere with 0.5 green ambiance, centered at (0,0,0) with radius 1
material 0 0.5 0 1 0 0 1 0 0 0 0 0 0 0 0 10 1 0
sphere 0 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
由OpenGL生成的结果图像.
我的渲染应用程序生成的图像.
如您所见,两者之间存在各种差异:
这些是我看到的最突出的三个差异.以下是我对Phong照明的实现:
R3Rgb Phong(R3Scene *scene, R3Ray *ray, R3Intersection *intersection)
{
R3Rgb radiance;
if(intersection->hit == 0)
{
radiance = scene->background;
return radiance;
}
R3Vector normal …Run Code Online (Sandbox Code Playgroud) 我想知道计算几种不同光源和环境光产生的阴影的最准确方法.环境光是存在于整个"世界"中的光,具有相同的强度而没有特定的方向,并且漫射光是由点光源的直接照明而发生的照明.
鉴于Ka是表面环境反射率的系数,Ia是环境光的强度,Kd是表面漫反射率,Ip1是第一(相应)点光源的强度,N是表面法线,L1是光(相应的第一个来源)方向.
根据我的参考资料,现场颜色的强度应为:
I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))
其中' .'是点积.
但根据我的理解,真实的光强度应该在光源之间进行某种平均,而不仅仅是将它们加起来,这样如果只有两个光源,则公式应如下所示:
I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/2
如果有3个光源,但是第三个被阻挡并且不直接照亮表面,那么:
I=Ka.Ia+Kd(Ip1(N.L1)+Ip2(N.L2))/3
(如果有一个所有3个灯都有贡献的地方,它会变得更亮.
我的假设是对的吗?
我正在写一个光线追踪器.到目前为止,我有漫反射,Blinn照明和反射.我的折射出了点问题,我不知道是什么.我希望有人可以帮助我.

我有一个大的红色漫射+ Blinn球体和一个折射指数n = 1.5的小折射球体.
小的只是搞砸了.
相关代码:
ReflectiveSurface::ReflectiveSurface(const Color& _n, const Color& _k) :
F0(Color(((_n - 1)*(_n - 1) + _k * _k) / ((_n + 1)*(_n + 1) + _k * _k))) {}
Color ReflectiveSurface::F(const Point& N, const Point& V) const {
float cosa = fabs(N * V);
return F0 + (F0 * (-1) + 1) * pow(1 - cosa, 5);
}
Color ReflectiveSurface::getColor(const Incidence& incidence, const Scene& scene, int traceDepth) const {
Point reflectedDir = reflect(incidence.normal, incidence.direction);
Ray …Run Code Online (Sandbox Code Playgroud) 我想做一个用于演示目的的编程RayTracer,Java同时给出关于光线追踪的一般介绍(还提到 3D,这个 2D 模型应该只是为了更容易理解,并训练我的一般 Java 知识)。
我的问题是,我不知道从哪里开始这整件事。
我会尝试的第一件事是使用向量从给定的坐标(例如鼠标光标的位置)跟踪屏幕上的每个像素。然后我会计算向量是否与多边形相交,然后我会在那里停止向量并只将它绘制到这个特定点。
也许我什至可以通过计算法线来绘制一些阴影,并以较低的强度在另一个方向反射向量。
那么绘制一个向量A = {everypixelonthescreen}到一个特定的Point P并计算交集是个好主意吗?
完成的版本应该看起来像这样:
我正在研究光线追踪器,并开始向场景中添加圆柱体。我遇到的问题是找到光线击中点的表面法向量。我需要这个才能进行漫射照明。此时我所拥有的是相机光线撞击圆柱体的 3d 点,以及由中心轴上的点定义的实际圆柱体,向量代表轴的方向和半径。所以总结一下我的问题,如何找到具有圆柱体撞击点、半径、其轴上的点和轴的方向向量的点的法线向量?
我正在使用 GLSL 计算着色器编写基于 GPU 的实时光线跟踪渲染器。到目前为止,它运行得非常好,但是当涉及同时具有反射和折射时,我偶然发现了一个看似无法解决的问题。
我的逻辑告诉我,为了在物体(例如玻璃)上进行反射和折射,光线必须一分为二,一条光线从表面反射,另一条光线通过表面折射。这些光线的最终颜色将根据某个函数进行组合,并最终用作光线源自的像素的颜色。我的问题是我不能在着色器代码中分割光线,因为我必须使用递归来做到这一点。根据我的理解,着色器中的函数不能递归,因为由于与旧 GPU 硬件的兼容性问题,所有 GLSL 函数都类似于 C++ 中的内联函数。
是否可以在着色器代码中模拟或伪造递归,或者我什至可以在不使用递归的情况下同时实现反射和折射?我看不出没有递归它是如何发生的,但我可能是错的。
对于光线跟踪器项目,我一直在研究处理找到光线和三角形之间交叉的算法(由三个顶点定义).到目前为止我发现的是Möller-Trumbore(MT)算法被普遍使用.
所以我的问题是1)是否有MT的替代方案或算法被认为是计算交叉点的最快方法?2)如果是,MT被证明是最优的还是有人可以想象发明更快的算法?
编辑:我现在看到我的问题与Ray-triangle交叉非常相似
[请看下面的编辑,问题的解决方案可能就在那里]
我正在尝试通过研究一个小型光线追踪器来学习 OpenCL(请参阅下面的代码,来自此链接)。
我没有“真正的”GPU,我目前使用的是带有 Intel(R) Iris(TM) Graphics 6100 显卡的 macosx 笔记本电脑。
该代码在 CPU 上运行良好,但在 GPU 上的行为很奇怪。它的工作(或不工作)取决于每个像素的样本数(在场景中传播光线后穿过像素以获得其颜色的光线数量)。如果我取少量样本 (64),我可以获得 1280x720 的图片,但如果我取 128 个样本,我只能获得较小的图片。据我了解,样本数量不应该改变任何东西(当然图片质量除外)。是否有一些与 OpenCL/GPU 完全相关的东西让我怀念?
此外,似乎是从崩溃的GPU内存中提取结果:
queue.enqueueReadBuffer(cl_output, CL_TRUE, 0, image_width * image_height * sizeof(cl_float4), cpu_output);
Run Code Online (Sandbox Code Playgroud)
在这个阶段我得到一个“中止陷阱:6”。
我错过了一些东西。
[编辑]经过一番研究,我发现了一个有趣的线索:图形卡可能会自愿中止任务,因为它需要太多时间。这种行为本来是为了避免“冻结”屏幕。这个话题就讲那个。
你怎么看?
我找不到关闭这种行为的方法。你知道怎么做吗?
以下是文件:
主.cpp:
// OpenCL based simple sphere path tracer by Sam Lapere, 2016
// based on smallpt by Kevin Beason
// http://raytracey.blogspot.com
#include <iostream>
#include <fstream>
#include <vector>
#include <CL\cl.hpp>
using namespace std;
using namespace cl;
const …Run Code Online (Sandbox Code Playgroud) 我试图在片段着色器中编写一个简单的光线追踪器。我有这个函数应该创建一个漫射球体,如下所示:
这是功能:
vec3 GetRayColor(Ray ray)
{
Ray new_ray = ray;
vec3 FinalColor = vec3(1.0f);
bool IntersectionFound = false;
int hit_times = 0;
for (int i = 0; i < RAY_BOUNCE_LIMIT; i++)
{
RayHitRecord ClosestSphere = IntersectSceneSpheres(new_ray, 0.001f, MAX_RAY_HIT_DISTANCE);
if (ClosestSphere.Hit == true)
{
// Get the final ray direction
vec3 R;
R.x = nextFloat(RNG_SEED, -1.0f, 1.0f);
R.y = nextFloat(RNG_SEED, -1.0f, 1.0f);
R.z = nextFloat(RNG_SEED, -1.0f, 1.0f);
vec3 S = normalize(ClosestSphere.Normal) + normalize(R);
S = normalize(S);
new_ray.Origin = ClosestSphere.Point;
new_ray.Direction = …Run Code Online (Sandbox Code Playgroud)