Opengl 在GLSL着色器中创建视图矩阵

Opengl 在GLSL着色器中创建视图矩阵,opengl,glsl,glm-math,Opengl,Glsl,Glm Math,我有许多位置和方向存储在GPU上的一维纹理中。我想将它们用作GLSL几何体着色器中的渲染源。为此,我需要从这些纹理创建相应的视图矩阵 我的第一个想法是绕道CPU,将纹理读取到内存中,然后从那里创建一组视图矩阵,使用类似于glm::lookat()的方法。然后将矩阵作为统一变量发送到着色器 我的问题是,是否可以跳过此迂回,而直接在GLSL几何体着色器中创建视图矩阵?同样,这个可行的性能是明智的吗? < P>视图矩阵是统一的,并且制服在渲染批处理的中间不会改变,也不能直接从着色器写入。到目前为止,我

我有许多位置和方向存储在GPU上的一维纹理中。我想将它们用作GLSL几何体着色器中的渲染源。为此,我需要从这些纹理创建相应的视图矩阵

我的第一个想法是绕道CPU,将纹理读取到内存中,然后从那里创建一组视图矩阵,使用类似于
glm::lookat()
的方法。然后将矩阵作为统一变量发送到着色器


我的问题是,是否可以跳过此迂回,而直接在GLSL几何体着色器中创建视图矩阵?同样,这个可行的性能是明智的吗?

< P>视图矩阵是统一的,并且制服在渲染批处理的中间不会改变,也不能直接从着色器写入。到目前为止,我不知道如何生成它,至少不直接生成

还请注意,几何体着色器在使用modelview矩阵变换顶点后运行,因此重新生成该矩阵或其一部分没有太大意义(至少在同一过程中)

当然,您可能仍然可以对变换反馈进行一些修改,将一些值写入缓冲区,然后将其复制/绑定为统一缓冲区,或者只是从着色器中读取值并作为矩阵进行乘法。这至少可以避免往返CPU——问题是这样的方法是否有意义,以及您是否真的想做这样一件模糊的事情。如果不确切知道您想要实现什么,很难判断什么是最好的,但很可能只是在顶点着色器中变换东西(读取那些纹理、构建矩阵、乘法)会更好、更简单。

没有人说(或者没有人应该说)视图矩阵必须来自CPU,通过一个统一的。只需从着色器内部纹理中的向量生成视图矩阵即可。也许实施“好老”对你有帮助

如果这种方法在性能方面是个好主意,这是另一个问题,但是如果这种纹理非常大或经常更改,那么这种方法可能比将其读回CPU要好


但也许您可以使用一个简单的类似GPGPU的着色器将矩阵预生成到另一个纹理/缓冲区中,该着色器只为纹理中的每个位置/向量生成一个矩阵,并将其存储到另一个纹理(使用FBO)或缓冲区(使用变换反馈)中。这样,您就不需要往返CPU,也不需要为每个顶点/基本体/任何对象重新生成矩阵。另一方面,这将增加所需的内存,因为4x4矩阵比位置和方向重一点。

当然。读取纹理,并根据值构建矩阵

vec4 x = texture(YourSampler, WhateverCoords1);
vec4 y = texture(YourSampler, WhateverCoords2);
vec4 z = texture(YourSampler, WhateverCoords3);
vec4 w = texture(YourSampler, WhateverCoords4);
mat4 matrix = mat4(x,y,z,w);

有什么问题吗?还是我错过了什么

也许我应该指定我倾向于使用分层渲染的视图矩阵。我指定要在几何体着色器中渲染到的层(
gl\u层
)。因此,在同一过程中渲染到多个纹理层。渲染目标是一个
纹理\u 2D\u数组
。在这种情况下,您可能需要一个不可操作的顶点着色器(假设它们没有完全相同、方向相同的几何体,则需要为每个层分别变换)。您只需从VS(以及可能的投影矩阵,如果它在任何地方都相同)转发模型矩阵,从这些纹理中的4个向量生成相应的视图矩阵,将MVP相乘,并将每个生成的基本体中的每个顶点与右侧的顶点相乘(属于它将进入的层的顶点).@Damon你有没有意识到,你的评论使你的答案完全无效?@ChristianRau:有,那又如何?该评论基于以前不可用的有关分层渲染的一些重要信息。仅给出“几何体着色器”和“模型视图矩阵”,答案中没有任何无效内容。法线是顶点着色器中发生的变换,法线是矩阵具有一致性。事后聪明是很容易的,你知道…@Damon事后聪明什么都没有。前两段过于僵硬,即使没有OP提供的任何进一步信息,也不可能是正确的。