我读过关于HLSL寄存器的本文件,但它更多的是语法描述,而不是目的解释。
实际上,HLSL中的寄存器是什么?我怎么用,什么时候用?如果我不这样做会发生什么(默认情况是什么)?
发布于 2013-05-11 07:13:57
给定的着色器模型向HLSL公开一组特定的寄存器;这些寄存器是GPU上的底层硬件寄存器,就像CPU寄存器一样,但是有更精确的范围(例如,有专门用于保存采样器的寄存器)。
寄存器是在您的着色器执行过程中存储所有数据的地方(除了存储在GPU的RAM中的纹理或顶点缓冲区数据之外)。在GPU上,在读取和操作内存方面不像在CPU上那样灵活。不存在“将这个值存储到RAM中片刻”,所以所有的东西都必须在寄存器中。这是特别明显的旧着色器组装(从着色器模型1时代)。
数据传输也可以通过这些寄存器,这就是为什么关键字仍然存在于更现代的着色器模型。例如,如果您不使用效果框架,您可以自己管理取样器或常量寄存器的分配(例如,通过SetVertexShaderConstant之类的方法)。类似地,缓冲区中的数据可以映射到寄存器;顶点输入寄存器通常在执行着色器之前将您的顶点缓冲区数据映射到它们。
您可以在MSDN上找到寄存器的列表及其用途。例如,这里是VS5.0的集合。
通常,您不需要直接使用它们,就像CPU寄存器一样。它们将由您在着色代码或API中使用的高级语言结构(如上述效果框架)自动使用。
发布于 2013-12-30 11:10:52
您在语法上处理的特定寄存器将是某种形式的I/O寄存器。乔希很好地解释了什么是寄存器以及为什么在GPU上使用它们。用于在特定寄存器中声明变量的语法用于传输数据。在CPU上创建一个输入布局(GL中的顶点数组对象)或设置制服或取样器/纹理。这会将顶点缓冲区中的值映射到特定的寄存器(通过顶点数据的语义)。C++代码和HLSL代码必须商定哪些数据将在哪些数据中,哪些寄存器用于输入,以及用于MRT等的输出。
如果没有显式指定寄存器,HLSL将为您选择它们。您不应该依赖于它如何选择它们;即使它看起来很稳定,它也可能在将来的版本中发生变化。您可以使用着色器内省API来确定编译器选择了哪些寄存器,这样就可以适当地设置输入布局。这比仅仅在着色代码中声明寄存器效率更低,也更困难。
从本质上说,C++说的是“相机数据在常量缓存寄存器3中”。然后,着色器必须从寄存器3中读取该缓冲区,否则它将无法正常工作。你可以像老GL强迫你那样以名字命名,但你不应该这么做。
这对于最近的GL/GLSL也是一样的,尽管显然语法和API不同。
发布于 2013-05-11 06:35:34
寄存器是位于处理器上的一种存储类型,并且访问速度非常快。它们通常较小,并用作处理器指令的输入和输出位置。HLSL提供了一种从CPU端将数据映射到这些寄存器的方法,以便在GPU上的着色器中使用。当您有需要在GPU中引用的数据时,应该使用它们,但是只有在CPU上运行时才能使用这些数据(如world view投影矩阵),因此必须将其复制到GPU寄存器中。下面是一篇描述非hlsl上下文http://en.wikipedia.org/wiki/Processor_寄存器中寄存器的文章。
https://gamedev.stackexchange.com/questions/55319
复制相似问题