- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我目前正在编写一个教程来实现一个非常基本的光线追踪器(目前只绘制实心球体)。所述教程位于此处:http://thingsiamdoing.com/intro-to-ray-tracing/
本教程完全与语言无关,仅涉及伪代码。我试图将此伪代码转换为 C,但遇到了困难。我的程序编译正常,但输出的 .ppm 图像文件出现早期 EOF 错误。由于缺乏有关该问题的信息,我陷入了困境。
这是我的 C 代码,它是伪代码的直接翻译:
#include <stdio.h>
#include <math.h>
#define WIDTH 512
#define HEIGHT 512
typedef struct {
float x, y, z;
} vector;
float vectorDot(vector *v1, vector *v2) {
return v1->x * v2->x + v1->y * v2->y + v1->z * v2->z;
}
void writeppm(char *filename, unsigned char *img, int width, int height){
FILE *f;
f = fopen(filename, "w");
fprintf(f, "P6 %d %d %d\n", width, height, 255);
fwrite(img, 3, width*height, f);
fclose(f);
}
float check_ray(px, py, pz, dx, dy, dz, r) {
vector v1 = {px, py, pz};
vector v2 = {dx, dy, dz};
float det, b;
b = -vectorDot(&v1, &v2);
det = b*b - vectorDot(&v1, &v1) + r*r;
if (det<0)
return -1;
det = sqrtf(det);
float t1 = b - det;
float t2 = b + det;
return t1;
}
int main(void) {
int img[WIDTH*HEIGHT*3], distToPlane;
float cameraY, cameraZ, cameraX, pixelWorldX, pixelWorldY, pixelWorldZ, amp, rayX, rayY, rayZ;
for (int px = 0; px<WIDTH; px++) {
for (int py = 0; py<HEIGHT; py++) {
distToPlane = 100;
pixelWorldX = distToPlane;
pixelWorldY = (px - WIDTH / 2) / WIDTH;
pixelWorldZ = (py - HEIGHT / 2) / WIDTH;
rayX = pixelWorldX - cameraX;
rayY = pixelWorldY - cameraY;
rayZ = pixelWorldZ - cameraZ;
amp = 1/sqrtf(rayX*rayX + rayY*rayY + rayZ*rayZ);
rayX *= amp;
rayY *= amp;
rayZ *= amp;
if (check_ray(50, 50, 50, rayX, rayY, rayZ, 50)) {
img[(py + px*WIDTH)*3 + 0] = 0;
img[(py + px*WIDTH)*3 + 1] = 0;
img[(py + px*WIDTH)*3 + 2] = 128;
}
else {
img[(py + px*WIDTH)*3 + 0] = 255;
img[(py + px*WIDTH)*3 + 1] = 255;
img[(py + px*WIDTH)*3 + 2] = 255;
}
}
}
writeppm("image.ppm", "img", WIDTH, HEIGHT);
}
我相当有信心错误不在于我编写 .ppm 文件的函数,因为我已经将其用于其他工作并且一切正常。
最佳答案
您可能希望在以下代码行中删除 "img"
周围的引号:
writeppm("image.ppm", "img", WIDTH, HEIGHT);
看看它的原型(prototype)是如何 void writeppm(char *, unsigned char *, int, int)
,虽然我很惊讶你的编译器至少没有给你一个关于类型的警告不匹配。
此外,作为记录,我建议放置一些错误检查代码(例如检查 fwrite 的返回值,或检查 fopen 的返回值)--- 但那只是我。
此外,如果您不是,请在启用所有警告的情况下进行编译(例如,使用 gcc use -ansi -Wall -pedantic),这将帮助您发现类型不匹配和其他小陷阱
关于c - 在 C 中实现基本的 Raytracer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27197236/
我目前正在为 3D 三角形实现边界体积层次结构。遗憾的是,对 BVH 的所有解释都不足以说明您对对象进行分类以进行拆分的部分。对于初学者,我想以平衡树为目标并使用中值切割。这将需要我在当前节点的拆分轴
我参加了考试,有一个我无法回答的问题..使用光线追踪不能实现什么样的照明现象(在这种情况下使用辐射度) 最佳答案 从技术上讲,路径追踪(这是一种光线追踪)实现了完整的光照方程。但他们可能意味着间接照明
我的光线追踪器中的阴影射线有问题。 请看下面两张图 3D sMax: alt text http://neo.cycovery.com/shadow_problem.gif 我的光线追踪器: alt
所以我正在尝试构建一个回溯器。我跟着这个教程:https://www.youtube.com/watch?v=SMOJGxyd9BE&list=PLHm_I0tE5kKPPWXkTTtOn8fkcwE
考虑一个球体,里面有一个“聚光灯”光源。我希望球体不要与那个特定的“聚光灯”光源交互,但它应该与所有其他光源交互。我知道这不现实,我只需要它来拍一张漂亮的照片。 这在 povray 中可能吗? 最佳答
我正在编写一个光线追踪器,但我在光线如何随着与光源的距离而衰减方面遇到了一些麻烦。距离值似乎太高了,所以当我将它们平方并除以强度时,我最终得到的只是黑屏。我如何改变像素上光源的强度而不压倒场景。现在我
所以我试图让 OBJ 加载在我的光线追踪器中工作。加载 OBJ 工作正常,但我在使纹理映射正常工作时遇到了一些问题。 这是我的结果图片。它应该是一个带有彩色“经纬度”线条的黑色球体,中间有一个黑点。但
我正在努力完成一项我应该实现光线追踪器的任务。我完成了一个基本的光线追踪器,但我几乎不知道如何实现阴影。我将包括一些我们必须编程的功能和一些我们给定的数据结构。我想我在理论上知道该怎么做,但我完全不知
前几天,我的光线追踪器突然停止创建位图。所以我将代码缩减为只有 Color 类和 BMP 类来尝试生成只有一种颜色的图像。不幸的是,这仍然没有创建位图。 错误发生在我尝试创建阴影光线时。当时没有对 C
我正在关注“Raytracer the next week”minbook Chapter 6,在我的场景中添加光线后,光线追踪器输出那些非常嘈杂的图像,我尝试将样本增加到深度数量,但仍然遇到这些问题
我正在使用“Ray Tracer From The Ground Up”一书作为教程,但我在相同的代码中没有相同的结果,我认为它是相同的(我已经检查了几次)。 我的问题是球形映射纹理到球体。 代码(d
我正在编写一个基于图 block 的小游戏,我想为此支持光源。但是我的算法功力太弱了,所以才来找你帮忙。 情况是这样的:有一个基于图 block 的 map (以二维数组的形式保存),包含一个光源和几
我正在用 C++ 编写光线追踪器,但我遇到了一些折射问题。我正在渲染一个球体和一个地平面,球体应该会折射。然而,它看起来更像是一个球体中的一个球体:“外部”球体看起来被正确着色,但没有折射,而“内部”
上学期我为一项作业写了一个光线追踪器,并想继续努力。任务中有 5 种 Material (用于物体),我们获得了它们的环境、漫反射、镜面反射和光泽度值。我很难找到这些值的列表来在线创建新 Materi
Kd 算法首先通过划分基元数组(三角形、球体等)来创建根 BSP 节点,以便创建两个新数组(左基元和右基元),用于创建其两个基元子树。 左基元和右基元是通过将给定基元数组划分为两个数组来计算的。通过取
我一直在尝试使用Phong模型制作有光泽的阴影,但是由于某种原因而不是有光泽的外观,我得到的只是球体前部的大白斑。最初,该模型适用于单个球体,但是现在我更新了代码,以便可以绘制多个球体,尽管应用了相同
我正在用 Java 编写 Raytracer,我已经可以创建对象、光线、测试交点,然后对像素进行着色。我还完成了一些基本的抗锯齿。我的问题是,如果创建一个球体,它应该位于世界的中心(即 0.0、0.0
我正在尝试并行化我目前正在为大学工作的 raytracer,但我似乎无法让它工作。我尝试了多种实现,但问题仍然存在。渲染在几毫秒后停止,最多渲染了一小块图片。 final ExecutorSe
我正在制作 MT Ray-Tracer 多线程,正如标题所说,它的执行时间是单线程版本的两倍。显然目的是将渲染时间缩短一半,然而我现在所做的只是让光线追踪方法运行两次,每个线程一次,基本上是将相同的渲
我不是在问如何计算光线与特定基元的交点,我是在问目前的方法是什么来尽快确定场景中数百万个基元中的哪个是下一个光线相交。 我听说八叉树和 kd 树很常用。我不知道是否还有其他方法也是当前的竞争者。 如果
我是一名优秀的程序员,十分优秀!