title: 软件渲染有没有办法提高纹理采样速度？
desc: 最简单的情况，就是在片元着色时，根据texcoord算出图片buffer位置，然后读出那一个像素来，继续光照等等其他计算。<br><br>稍微复杂一点的也无非就是根据texcoord以及某种过滤方法，比如双线性等，算出四个或更多buffer位置，读出像素来混合一下，然后继续。<br><br>可问题是，每次profile都发现读取像素值特别慢，说白了就是读内存慢吞吞的。比如，codexl总是报告在一个我写的没有几行的读取纹理的函数里，一条mov reg，mem指令被采到了很多很多samples。<br><br>我的猜测是：<br><br>1，如果纹理特别特别大，则高缓一次装不下多少纹理。如果再加上texcoord跳来跳去的，miss想必挺严重。<br><br>2，如果用多线程并行处理片元，并且由于启用了超线程，使得两个线程跑在同一个物理核上，但它们却只能分享同一个高缓。如果它们处理的片元几何距离较远，也更加加剧了在纹理中跳来跳去的现象，也就更加剧了miss。<br><br>我想问问有没有什么好的方法提高软件渲染读取纹理的速度？<br><br>请别告诉我等DDR5啊呵呵
topic: 计算机图形学
content: 的确纹理读取和Filter对的确比吃软件渲染的性能。对于不同类型的渲染器和在不同硬件平台来说，优化策略也都有有些不一样。Ray Tracer和Rasterizer的优化策略不同，CPU和GPU程序的优化策略也不同。首先确保一些最简单基本的优化一定得有。这些优化也是与平台无关的。例如对于Albedo texture来说，储存的时候不要傻乎乎的存float或者double，不然一个Texel的大小就是16或者32个byte。直接全部存成unsigned char（HDR纹理除外）
answerer_tags: Master of Light