opengl 相机的背景颜色,每通道32位

zpgglvta  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(141)

我需要Unity的Camera.Render()来生成一个特定的网格渲染-输出纹理必须使用GraphicsFormat.R32G32B32A32_UInt,i格式。即每通道32比特,因此每像素128比特。渲染的背景也应该是一个特定的128位颜色,但是我只能用类ColorColor32设置Camera.backgroundColor,每个通道最多存储8位。
我有一个备用的想法如何克服这一点-通过渲染一个输出恒定的128位颜色的着色器的四边形,但我想首先找出是否有可能与普通Camera.backgroundColor或一些原始OpenGL命令。
在我使用Unity之前,我已经确定你可以调用OpenGL命令glClearColor(),每个通道传递32位值,所以为什么Unity不能支持它真的很令人困惑。
请问,你能不能建议一个或多或少的传统方式,让Unity传递一个128位的清晰颜色,或者我如何用Camera.Render()调用一个原始的OpenGL命令来实现我想要的?

t40tm48m

t40tm48m1#

您正在使用(平台无关)着色器解决方案,因为即使Color(不是Color 32)结构体由每个通道的浮点数组成,因此每个通道4字节,它仍然是浮点数。
您可以尝试以下操作:

  • 在项目设置/图形中启用HDR
  • 在相机上启用HDR
  • 在脚本中设置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用于自定义结构。例如,对于不同的国家)。
您还需要在项目设置中将颜色空间设置为线性。

相关问题