Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:在着色器中执行TexCoord计算,不好的做法?_C++_Opengl_Shader - Fatal编程技术网

C++ OpenGL:在着色器中执行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

我目前正在为一个游戏开发一个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;

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。。。。这将允许您使用单个着色器,这意味着在渲染过程中不更改程序。但是,您仍然可以选择多个着色器,您不会注意到现代游戏每帧切换数百到数千次程序的差异