我如何显示我的SetPixels()纹理更改而无需缩放正交摄影机?

时间:2018-12-26 19:27:47

标签: c# android unity3d texture2d orthographic

这是我的第一个问题!我希望你能忍受我。 :)

我正在Unity上进行洪水填充,尽管我已经能够在Texture2D上填充形状,但是只有在使用正交摄影机放大时才能看到更改。当我缩小时,它会恢复为原始图像。同样奇怪的是,这同时发生在我的编辑器和游戏场景中,以及我在Android上进行构建时。

可能是什么原因造成的?我该怎么做才能避免这种情况?我想念什么吗?

我尝试使用不同大小的图像,但是它的行为仍然相同。

这是放大后使用SetPixels()填充形状后的外观。红色圆圈原为白色。请注意,编辑器未显示更改。图片尺寸为1920x1080:

这是缩小后的样子。现在,游戏场景也没有显示更改。我还在屏幕截图中包括了纹理的属性:

我还观察到它甚至可能与相机变焦无关,因为即使我没有放大太多,如果在检查器中按比例放大图像,也会出现变化的像素:

2 个答案:

答案 0 :(得分:1)

您只为特定的mipmap值设置像素(默认情况下为0级),但是您需要将更改扩展到相机当前正在查看的mipmap级别。

您可以通过在将mipmap级别设置为0(可能是您所设置的像素)后将Texture2D.Apply()设置为updateMipMaps(默认设置)来调用true已经在做)。

答案 1 :(得分:1)

您没有提供任何代码,因此很难说出实际情况。仅从描述来看,听起来好像是未更新的mipmap的问题。 Mipmap用于提供同一图像的不同分辨率,因此可以根据实际渲染纹理的大小使用适当大小的版本。

使用Texture2D.SetPixels()时,您总是修改一个特定的Mipmap级别,即图像的一个特定尺寸的版本。默认情况下,此级别为0,即基本的mipmap级别,其中包含完整尺寸的版本。

从描述中听起来像是在修改基本mipmap级别后,您调用了updateMipmaps参数设置为false的{​​{3}},如Texture2D.SetPixels()中显示的示例。这样可以防止更新纹理的其他mipmap级别,因此只有完整版本具有更改,而其他都没有。现在,当以较小的比例(即通过其当前的缩放级别,通过缩小或缩小)渲染纹理时,更改不会显示,因为从未更新过相应的较小的mipmap。

Texture2D.Apply()中的文档有点误导人:

  

如果updateMipmaps为true,则也将使用基本级别作为源重新计算mipmap级别。通常,在所有情况下都希望使用true,除非您自己使用SetPixels修改了mip级别。

这表示您不希望使用updateMipmaps时使用SetPixels,但这实际上仅意味着从某种意义上说,如果您修改了所有单独的mipmap级别,就不会使用SetPixels(例如SetPixels中的示例)。如果仅修改了基础级别,那么您确实想使用updateMipmaps = true,以便从修改后的基础自动更新其他mipmap级别。