【问题标题】:OpenGL: Performing TexCoord calculations within shader, bad practice?OpenGL:在着色器中执行 TexCoord 计算,不好的做法?
【发布时间】:2018-09-26 06:50:43
【问题描述】:

我目前正在为游戏开发 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 端进行计算甚至可能比在着色器中慢。请注意,在 CPU 上计算最终的 tex-coord 也意味着将整个几何数据复制回 GPU 内存。

标签: c++ opengl shader


【解决方案1】:

修改网格的属性数据是可编程管道的主要目的,将其移动到CPU将转化为性能降级。此外,正如@BDL 所指出的,您需要将数据重新发送到 GPU,这是整个过程中最糟糕的部分。

另一种情况是,当您对所有着色器实例执行相同的计算时,这将更适合在 CPU 上执行此类操作并将其作为统一文件上传。

【讨论】:

  • 我希望我的引擎中只有一小部分网格会不断更新它们的坐标(例如滚动背景)。另一种情况是使用 spritesheet 为图像设置动画时。在这种情况下,我希望每几帧更新一次坐标。但除此之外,地板和墙壁等图像将被平铺并始终保持不变。我应该考虑使用多个着色器来处理每个独特的网格类型和行为吗?
  • 如果除了纹理坐标修改之外,其余着色器都相同(顶点着色器、片段着色器等),我建议使用统一变量(如浮点数)来控制何时应用该位移,因此当您不想应用任何位移时,将统一设置为 0.0 (...texCoord.x + u_Offset * controlFlag...)。这将允许您使用单个着色器,这意味着不会在渲染过程中更改程序。但是,您仍然可以选择多个着色器,您不会注意到差异(现代游戏每帧切换数百到数千次程序)
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2018-11-28
  • 2018-05-07
  • 2020-02-23
  • 1970-01-01
  • 2017-01-20
  • 2020-11-22
  • 2017-02-24
相关资源
最近更新 更多