Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 是否可以使用Xna在一次过程中将场景渲染为多个纹理?_Optimization_Xna_3d_Render To Texture - Fatal编程技术网

Optimization 是否可以使用Xna在一次过程中将场景渲染为多个纹理?

Optimization 是否可以使用Xna在一次过程中将场景渲染为多个纹理?,optimization,xna,3d,render-to-texture,Optimization,Xna,3d,Render To Texture,我想知道是否有可能在一次过程中将场景渲染到多个渲染目标(或者比通过客户端代码多次绘制场景更快)。我想优化一些代码,这些代码被渲染成不同尺寸的纹理(例如512×512、256×256、128×128和64×64) 我意识到我可以使用源自原始目标的mip贴图,但我不想混合颜色。我怀疑mip映射将从几个texel中取平均值,但出于我的目的,我只希望使用图形卡渲染的未渲染渲染。如果有任何mipmap设置允许这样做,那么它也是一个可行的解决方案 另一方面,有人知道mipmap是在CPU还是GPU上生成的吗

我想知道是否有可能在一次过程中将场景渲染到多个渲染目标(或者比通过客户端代码多次绘制场景更快)。我想优化一些代码,这些代码被渲染成不同尺寸的纹理(例如512×512、256×256、128×128和64×64)

我意识到我可以使用源自原始目标的mip贴图,但我不想混合颜色。我怀疑mip映射将从几个texel中取平均值,但出于我的目的,我只希望使用图形卡渲染的未渲染渲染。如果有任何mipmap设置允许这样做,那么它也是一个可行的解决方案

另一方面,有人知道mipmap是在CPU还是GPU上生成的吗


感谢阅读。

您的问题没有可能的解决方案。MRT不能使用不同的分辨率。mipmapping无法生成与原始纹理完全相同的较小纹理。事实上,绝对没有办法做到这一点。使用新的图形卡,可以在GPU上生成mipmap。
有一个问题:为什么要渲染方形目标?

正如Quang Anh所说,没有办法完全按照您的要求进行渲染。那么你到底想达到什么目的呢

如果您担心缩小mipmap时发生的混合,为什么不使用渲染器将渲染目标(在“全屏”四元体上)渲染到另一个渲染目标?(并对所需的每种尺寸重复该步骤。)


增加了以下评论:

如果您正在执行的操作涉及深度(或与深度类似的数据),并且您需要知道每像素的最大(或最小)深度,并且每次都将图像的分辨率减半:

可以使用相同的缩放技术,通过点采样将一个渲染目标渲染到另一个渲染目标(如上面我的原始答案中所述)。在像素着色器中,采样将成为输出图像中一个像素的四个像素。只需从四个像素中选择最大(或最小)值像素作为要输出的像素


(我将把获取样本所需的数学作为练习。)

方形目标是示例,我只是想说明我想要不同的尺寸。实际上,在我的例子中,我希望每个纹理的大小都是前置纹理的一半,前置纹理应该可以有任何宽度和高度。我在优化中发现了一个理论概念,利用原语生成剔除数据。纹理颜色值表示数据,我希望剔除数据以不同的细节进行光栅化,同时保留光栅化器的输出。也就是说,如果我将2×2纹理缩小为1×1纹理,如果2×2包含1×1纹理,我应该使用数据设置1×1纹理。我想这就是mipmap成为问题的地方,因为mipmap混合了颜色。要使其工作,颜色不得混合。它们必须像渲染为1by 1纹理一样返回。这应适用于任何可变大小的纹理,而不仅仅是2x2和1x1(因此示例中有512x512和256x256)。我想解决办法是根据纹理大小多次渲染帧。@语句:基本上,您需要多次渲染场景才能获得像素级的结果。点采样将防止您进入原始图像以外的值之间-但结果不一定是光栅化器输出的像素精度。。。现在,也就是说,如果你的技巧是基于深度的(或者其他一些值,其中值太大或太小都是可以的),那么我的技巧是可以调整的——看我对我的答案所做的补充。不,它不是基于深度的。起初,我试图避免使用“中间”(插值)值,但仔细想想这个问题,我可能真的想要它们。所以我想我还是希望生成mip图。基本思想是在输出纹理中只存储一个标志,类似于模板贴图。如果较小的纹理具有任何“可见标志”纹理,则该纹理必须展开,以确定通过另一个渲染过程整个块是否可见,并使用较大的纹理放大“可见标志”。由于渲染是光栅化的,我想我可以保证子采样区域的任何超级采样都包含任何进一步的“可见标志”。请注意,这并不意味着一个对象占据整个区域,只是表明它可能会这样做,并且该区域中至少有一个对象覆盖了屏幕空间。