【问题标题】:The cost of texture2D in glslglsl中texture2D的开销
【发布时间】:2013-06-11 22:47:09
【问题描述】:

对这个功能很困惑 在glsl的代码中,总能看到这样的东西

uniform sampler2D source;
varying vec2 textureCordi;

void main()
{
    vec2 uv = textureCordi.xy;
    vec3 t1 = texture2D(source, vec2(uv.x - step_w, uv.y - step_h)).rgb; //2
    float average = (t1.r + t1.b + t1.g) / 3.0;
    //.....
}

在//2中,t1保存了源的数据(我认为是数据),但是它复制了多少数据呢? 纹理坐标在0~1之间,假设纹理是图像 图片大小为 1024 * 768 t1 会节省 1024 * 768 的像素数吗? gpu 在这个命令下会做什么?

如果 t1 做繁重的复制工作,我可以问 texture2D 是否返回 源对 t1 的引用(如 c++)?

【问题讨论】:

标签: opengl glsl


【解决方案1】:

该操作只查找一个纹理像素,它对应于您传入的纹理坐标(考虑到过滤、mipmap 等)。纹理坐标是您要获取的纹素的归一化坐标。

编辑:t1 保存操作请求的一个纹素的 rgb 值(作为具有 3 个分量的向量)。归一化纹理坐标是texture2D 的输入。下一行计算的是那个纹素的三个通道的平均强度,而不是整个纹理的平均值。

【讨论】:

  • 你的意思是t1不保存像素数据,而是纹理的归一化坐标?如果t1不保存纹理的数据,怎么可能float average = (t1.r + t1. b + t1.g) / 3.0;得到RGB通道的平均值?
  • @StereoMatching 当然会保存数据,但只保存给定纹理坐标所请求的单个纹素。
  • @StereoMatching Christian Rau 是正确的,编辑了我的答案以澄清这一点。
【解决方案2】:

这是每个片段的操作,对于每个片段,使用texture2D 您可以对单个纹素进行采样。许多并行操作是在 gpu 上针对整个基元完成的,在某种程度上,是的,所有数据最终都“存储”在某个输出缓冲区中,但每个 main() 函数仅针对当前片段运行。它不知道其他片段发生了什么,因此每个操作都是针对片段的。

为了进一步澄清这一点,这应该会有所帮助,但可能有点矫枉过正: GPGPU-http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html 片段着色器管道 - http://www.lighthouse3d.com/tutorials/glsl-tutorial/fragment-processor/

希望这会有所帮助。

【讨论】:

  • 根据您的回答,t1 只存储一个纹素而不是纹素数组。gpu 将执行每个片段的计算,这就是 gpu 管理数据的方式?
  • 它计算每个片段,texture2D 使用当前数据运行,而不是平均数据,一旦计算结束,gl_FragColor 会将该颜色存储在该片段特定位置的某个输出缓冲区中。 textuer2D 会根据采样纹理的插值方法查看一个或几个纹素。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多