我需要Unity的Camera.Render()
来生成一个特定的网格渲染-输出纹理必须使用GraphicsFormat.R32G32B32A32_UInt
,i格式。即每通道32比特,因此每像素128比特。渲染的背景也应该是一个特定的128位颜色,但是我只能用类Color
和Color32
设置Camera.backgroundColor
,每个通道最多存储8位。
我有一个备用的想法如何克服这一点-通过渲染一个输出恒定的128位颜色的着色器的四边形,但我想首先找出是否有可能与普通Camera.backgroundColor
或一些原始OpenGL命令。
在我使用Unity之前,我已经确定你可以调用OpenGL命令glClearColor()
,每个通道传递32位值,所以为什么Unity不能支持它真的很令人困惑。
请问,你能不能建议一个或多或少的传统方式,让Unity传递一个128位的清晰颜色,或者我如何用Camera.Render()
调用一个原始的OpenGL命令来实现我想要的?
1条答案
按热度按时间t40tm48m1#
您正在使用(平台无关)着色器解决方案,因为即使Color(不是Color 32)结构体由每个通道的浮点数组成,因此每个通道4字节,它仍然是浮点数。
您可以尝试以下操作:
Camera.backgroundColor
,即使r,g,B,a值远高于1。0。HDR颜色仅用16位处理,因此它可能仍然不是纹理的正确清晰颜色。然后,您需要使用具有恒定颜色解决方案的自定义着色器。你的背景色值到底是多少?
编辑评论:经过一些研究,您使用自定义着色器(甚至计算着色器)的想法似乎是最好的路线,因为似乎没有办法将128位(uint)颜色设置为Unity的内置变量,如
Camera.backgroundColor
。我测试了它的值250(十六进制FAFAFAFA),结果以10为基数的int值是4210752250,作为浮点数,你失去了最后3位的精度,得到了4210752000。至少在着色器内部,您可以使用
uint4
(如uint4 bgcolor = uint4(250, 250, 250, 250)
)或通过统一的C#设置它。如果你想在着色器中传输大量的颜色(例如,颜色),还有StructuredBuffer用于自定义结构。例如,对于不同的国家)。您还需要在项目设置中将颜色空间设置为线性。