【问题标题】:pass texture map to another fragment shader将纹理贴图传递给另一个片段着色器
【发布时间】:2019-09-14 02:47:53
【问题描述】:

我想在一个片段着色器中在 WebGl 中生成一个纹理贴图,然后将该纹理贴图传递给另一个片段着色器进行处理,但语法让我无法理解。我相信如果我理解正确的话,我在网上找到的一个例子说我可以这样做:

(1)
// setup frame buffer and depth buffer for the two fragment shaders.


(2)
// texture map generating frag shader:

uniform sampler2D texturemap;

void main(){
    // generate texture map
    vec4 coorindate_value = ...;
    output_texture = texture( texturemap , coorindate_value );
    // my understanding is that that sampler2d will generate some kind of a mapping. how can I map coorindate_value to some other vec4, like another vec4 coordinate???
}


(3)
// second fragment shader:

uniform sampler2D same_texturemap;

void main(){
    vec4 coorindate_value = ...;
    vec4 value = texture2D( same_texturemap , coorindate_value );
    // the returned value should be one of the color values from the first fragment shader, correct??

}

我并不是在寻找任何人提供代码来帮助我,只是为了确认我了解它是如何工作的。 我想我的主要困惑在于 sampler2D 的实际作用。它是否像字典或哈希表一样,因为它在两个值之间进行映射,如果是,我该如何选择这两个值是什么?任何提示或更正都会很棒。

提前感谢

【问题讨论】:

  • sampler2D 是对纹理的引用。纹理是一个二维数据数组,您可以使用texture2D 函数提取数据。您将 sampler2D 制服和标准化纹理坐标传递给它。 WebGL 中的输出是通过一个特殊的变量gl_FragColor。您可能需要read some tutorials on webgl。这是一个specifically about textures,但如果您不熟悉 WebGL 的其余部分,您可能需要阅读前面的文章。

标签: webgl texture2d


【解决方案1】:

sampler2D 是对纹理单元的引用。纹理单元保存对纹理的引用。纹理是一个二维数据数组,您可以使用texture2D 函数提取数据。您将 sampler2D 制服和归一化纹理坐标传递给它。它从纹理中返回一个采样值。我说 sampled 值是因为该值的生成方式取决于纹理的过滤器设置。

WebGL 中的输出是通过一个特殊的变量gl_FragColor。如果未绑定任何帧缓冲区,则输出将转到画布的当前帧缓冲区。

您可能需要read some tutorials on webgl。这是specifically about texturesrendering to texture,但如果您不熟悉WebGL 的其余部分,您可能需要阅读前面的文章。

【讨论】:

  • 好吧,看来我对纹理和 sampler2Ds 的理解是正确的。你知道我如何在一个片段着色器中用数据填充纹理(假设 fs 刚刚被赋予一个填充了不重要的初始值的纹理),然后将该纹理传递给另一个片段着色器?如果不可能,我理解。谢谢gman。
  • 片段着色器一次输出一个像素。就这些。要确定该像素的去向,您需要在顶点着色器中生成位置。你如何做到这一点1000%取决于你。您可以通过属性传递位置,通过数学生成位置,或者两者的某种组合。听起来你真的需要阅读教程。见:webglfundamentals.org/webgl/lessons/webgl-how-it-works.html
  • 当然,我会检查一下,但是一旦我在我的纹理中填充了数据,我可以将该纹理传递给另一个片段着色器吗?如果有,怎么做?
  • 以同样的方式将任何纹理传递给任何片段着色器。这只是一种纹理。它并不特别,只是因为您是从其他片段着色器中写入的。解释如何使用纹理是一个巨大的话题,我为什么给你链接
  • 我完全理解。非常感谢您提供的资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多