C++ OpenGL:在着色器中执行TexCoord计算,不好的做法?
我目前正在为一个游戏开发一个2D图形引擎。我的着色器接受2个UV偏移浮动,并通过应用偏移计算TexCoord 以下是我的顶点着色器示例:C++ OpenGL:在着色器中执行TexCoord计算,不好的做法?,c++,opengl,shader,C++,Opengl,Shader,我目前正在为一个游戏开发一个2D图形引擎。我的着色器接受2个UV偏移浮动,并通过应用偏移计算TexCoord 以下是我的顶点着色器示例: #shader vertex #version 330 core layout(location = 0) in vec4 position; layout(location = 1) in vec2 texCoord; out vec2 v_TexCoord; uniform float u_Offset; uniform float v_Offset
#shader vertex
#version 330 core
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texCoord;
out vec2 v_TexCoord;
uniform float u_Offset;
uniform float v_Offset;
void main()
{
gl_Position = position;
v_TexCoord = vec2(texCoord.x + u_Offset, texCoord.y + v_Offset);
};
从长远来看,我是否应该担心这会导致性能问题?如果我在通过最终UV之前在CPU端执行计算,会有多大的不同?它值得优化吗?修改网格的属性数据是可编程管道的主要目的,将其移动到CPU将转化为性能降级。此外,正如@BDL所指出的,您需要将数据重新发送到GPU,这是整个过程中最糟糕的部分
另一种情况是,当您对所有着色器实例执行相同的计算时,这将更适合在CPU上执行此类操作并将其作为统一文件上载。偏移量多久更改一次?如果它可能会更改每一帧,那么在CPU端执行计算可能比在着色器中执行计算还要慢。请注意,在CPU上计算最终的tex坐标还意味着将整个几何数据复制回GPU内存。我希望在我的引擎中只有少数网格不断更新坐标,例如滚动背景。另一种情况是使用精灵表设置图像动画。在这种情况下,我希望coords每两帧更新一次。但除此之外,诸如地板和墙壁等图像将被平铺,并且始终保持不变。我是否应该考虑使用多个着色器来处理每个唯一的网格类型和行为?如果除了纹理坐标修改之外,其余的着色器是相同的顶点着色器、片段着色器等,我建议使用一个均匀的变量,比如浮点来控制何时应用该位移,因此当您不想应用任何时,将制服设置为0.0…texCoord.x+u_Offset*controlFlag。。。。这将允许您使用单个着色器,这意味着在渲染过程中不更改程序。但是,您仍然可以选择多个着色器,您不会注意到现代游戏每帧切换数百到数千次程序的差异