一周实现Raytracer仅渲染首行,如何修复该问题?
问题分析与修复
你的代码只渲染首行的核心原因:内层循环的n_count变量在完成第一行遍历后未重置为0。当外层循环进入下一行迭代时,n_count已经等于WIDHT(256),不再满足n_count <= WIDHT-1的条件,内层循环直接跳过,导致后续行无输出。
修改后的代码
fn main() { const HEIGHT: i32 = 256; const WIDTH: i32 = 256; // 修正拼写错误:WIDHT -> WIDTH println!("P3\n{} {}\n255", WIDTH, HEIGHT); let mut i_count = HEIGHT - 1; while i_count >= 0 { let mut n_count = 0; // 将n_count移到外层循环内,每次处理新行时重置为0 while n_count <= WIDTH - 1 { let r = n_count as f64 / (WIDTH - 1) as f64; let g = i_count as f64 / (HEIGHT - 1) as f64; let b = 0.25; let ir = (255.999 * r) as i64; let ig = (255.999 * g) as i64; let ib = (255.999 * b) as i64; println!("{} {} {}", ir, ig, ib); n_count += 1; } i_count -= 1; } }
补充说明
- 顺带修正了代码里的拼写错误
WIDHT改为WIDTH,避免后续可能出现的逻辑混乱。 - 将
n_count的声明移至外层循环内部,确保每处理一行前,该变量都会被重置为初始值0,保证内层循环能完整遍历当前行的所有像素。
内容的提问来源于stack exchange,提问作者Maxhorseman
相关产品推荐
相关产品推荐

