这个功能相当混乱 在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 ++)?
答案 0 :(得分:4)
该操作只查找一个纹素,它对应于您传入的纹理坐标(考虑过滤,mipmap等)。纹理坐标是您要获取的纹素的标准化坐标。
编辑:t1保存操作请求的一个纹素的rgb值(作为具有3个分量的向量)。标准化纹理坐标是texture2D
的输入。以下行计算该一个纹素的三个通道的平均强度,而不是整个纹理的平均值。
答案 1 :(得分:1)
这是每个片段的操作,对于每个片段,使用texture2D
对单个纹素进行采样。对于整个原语,在gpu上完成了许多并行操作,并且在某种程度上,是的,所有数据最终都“存储”在某个输出缓冲区中,但每个main()
函数仅针对当前片段运行。它不知道其他片段发生了什么,所以每个操作都是片段化的。
为了进一步澄清这一点,这应该有所帮助,但它可能有点过分: GPGPU - http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html 片段着色器管道 - http://www.lighthouse3d.com/tutorials/glsl-tutorial/fragment-processor/
希望这有帮助。