Opengl 顶点着色器规范化

Opengl 顶点着色器规范化,opengl,graphics,glsl,shader,vertex-shader,Opengl,Graphics,Glsl,Shader,Vertex Shader,我可能有一个非常愚蠢的问题。 我需要在我的顶点着色器中使用2个规格化向量A和B,我已经在CPU上为其他目的计算了它们。但要将它从CPU传递到着色器,我必须再添加一个vec4属性2*vec2=vec4。我已经传递了另一个向量C和D,这是A和B,但乘以了一些系数 我愚蠢的问题是——我应该传递notmalized向量,还是从C和D得到它 attribute vec4 dirs; // .xy = C, .zw = D void main(){ ... vec4 norm_dirs = ve

我可能有一个非常愚蠢的问题。 我需要在我的顶点着色器中使用2个规格化向量A和B,我已经在CPU上为其他目的计算了它们。但要将它从CPU传递到着色器,我必须再添加一个vec4属性2*vec2=vec4。我已经传递了另一个向量C和D,这是A和B,但乘以了一些系数

我愚蠢的问题是——我应该传递notmalized向量,还是从C和D得到它

attribute vec4 dirs;    // .xy = C,   .zw = D

void main(){
...
vec4 norm_dirs = vec4(normalize(dirs.xy), normalize(dirs.zw));    // .xy = A, .zw = B
...
}

我问这个问题是因为我担心GPU内存->与吞吐量的关系。在这里,它会将vec4属性计数增加1.5-2倍


有什么理由让我担心吗?

从总体上看,顶点数据获取是便宜的。GPU中的大部分内存带宽用于碎片操作,如纹理、混合等。另一方面,标准化可能很慢。12年前,通过立方体贴图纹理提取来避免标准化是很常见的,现在GPU的处理能力比内存带宽/延迟更好。由于GPU架构的变化,最好的做法是在目标硬件上配置着色器。。。你这样做了吗?我没有访问所有目标硬件的权限:那么你就没有目标了。通过目标硬件,我指的是关于GPU使用年限的大致数字。例如,如果您的目标是OpenGL 2.0类硬件,那么某些优化方法可能适用于不适用于3.0的优化方法。除非您使用的是前沿pbs,否则我怀疑这会有任何区别。一些12个以上的指令不会让你的fps减半。
attribute vec4 dirs;         // .xy = C,  .zw = D
attribute vec4 norm_dirs;    // .xy = A, .zw = B

void main(){
...
// nothing to do here
...
}