Forum Replies Created
-
AuthorPosts
-
你可以检查一下是不是算了两遍ambient
理论上ambient给了全局强度,算一遍就好了。
那你这不就是超采了吗,理论上是最完美的,但是这样还是AA么?
你说的这一步已经有了,和我提出的这个问题没有关系。。。
我仔细思考了一下,似乎按我的做法并没有完全去除这个黑色。不知道我做的方法对不对,感觉即使使用了细化深度检测,也只能接近更好,而不能消除残留。
你看这样行不
void rst::rasterizer::set_pixel(const Eigen::Vector3f &point, const Eigen::Vector3f &color) { // old index: auto ind = point.y() + point.x() * width; int j = round(point.y()); int i = round(point.x()); if (j < 0 || j > height - 1) return; if (i < 0 || i > width - 1) return; // auto ind = (height - 1 - round(point.y())) * width + round(point.x()); auto ind = (height - 1 - j) * width + i; frame_buf[ind] = color; }
理论上都应该取整,而且应该做边界判断,你其实可以写一个更准确的版本出来,我随便取一下只是避免了移行问题。
理论上,就不应该给set_pixel传递浮点值。
我想了想,觉得你说的很有道理,你已经把黑边的问题讲的很明白了~
👍没问题,还有可能同时小于0。
等于零的时候,也有很多细节性的规定。
为什么code的字体这么小呢?
我写了一个新的命令行parser部分,测起来就比较方便了。
while (parsePos < argc) { std::string arg = std::string(argv[parsePos]); if (arg == "-r") { if (parsePos + 1 >= argc) { std::cerr << "-r option error" << std::endl; std::cerr << "Usage: " << argv[0] << " -r angle [-a axisX axisy axisZ] [filename.png]" << std::endl; exit(-1); } angle = std::stof(argv[parsePos + 1]); parsePos += 2; } else if (arg == "-a") { if (parsePos + 3 >= argc) { std::cerr << "-a option error" << std::endl; std::cerr << "Usage: " << argv[0] << " -r angle [-a axisX axisy axisZ] [filename.png]" << std::endl; exit(-1); } raxis.x() = std::stof(argv[parsePos + 1]); raxis.y() = std::stof(argv[parsePos + 2]); raxis.z() = std::stof(argv[parsePos + 3]); parsePos += 4; } else if (arg.rfind(".png") == arg.size() - 4) { command_line = true; filename = arg; parsePos += 1; } else { std::cerr << "Invalid option or filename: " << arg << std::endl; std::cerr << "Usage: " << argv[0] << " -r angle [-a axisX axisy axisZ] [filename.png]" << std::endl; exit(-1); } }
没什么困扰,倒是让我好好看了看代码,修的很快,给力!
兄弟我来回答你一下吧,虽然我不是助教。
1. 你说的是frustum的远近平面还是说的标准化设备坐标(NDC)的?OpenGL的NDC是从[-1,-1,-1]~[1,1,1], DirectX的NDC是xy从[-1,-1]~[1,1],z是0到1. 而frustum的远近值是你自己设定的,比如说渲染多远,一般是看机器性能来设置的,一般游戏里也有一个条让你拉,选择渲染距离,往往就是调整这个frustum的far plane的值的。
2. 是的,lookat一共有7个自由度,首先是摄像机的坐标,然后是观察点的坐标,然后是摄像机旋转的方向。输入这7个值(一般是给出摄像机坐标,观察点,以及一个上参考矢量)。 比如OpenGL是这样创建的。
glm::mat4 view; view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
3. 你对model的理解不是很正确,model矩阵是什么呢,比如有一个箱子,它的坐标有一个local坐标,8个点,大概长这个样子:(点集A)
[0,0,0] [0,1,0] [1,0,0] [1,1,0] [0,0,1] [0,1,1] [1,0,1] [1,1,1]
但是你这样的坐标是针对这个model内部来说,local的,你把它放在一个大的world里,比如不旋转,只是把箱子平移了[2,2,0], 那么你的箱子的这8个点在world里就变成了:(点集B)
[2,2,0] [2,3,0] [3,2,0] [3,3,0] [2,2,1] [2,3,1] [3,2,1] [3,3,1]
这个从点集A到点集B的变换就是model矩阵。
至于你说的model上加上一些颜色值,最终显示出来,这本质上也没错,就像以下图片的第五步一样,非常的简单。
-
AuthorPosts