【问题标题】:WebGL Shader VariablesWebGL 着色器变量
【发布时间】:2020-06-24 20:07:58
【问题描述】:
var fragmentShaderSource = '\
            varying highp vec4 color; \
            varying mediump vec2 texCoord;\
            varying highp vec3 v; \
            varying highp vec3 n; \
            uniform sampler2D sampler2d;\
            void main(void) \
            { \
                gl_FragColor = color + 0.0 * texture2D(sampler2d, texCoord); \
                gl_FragColor.a = 1.0; \
                console.log(color); \
            } \
    ';

我是 WebGL 的新手,奇怪的是,尽管我没有初始化任何东西,但怎么可能使用像 colorsampler2d 这样的变量?有默认值吗?

【问题讨论】:

  • varying 参数的初始值是通过从顶点着色器插入匹配的varying 参数来预先确定的。 uniform 参数在着色器用于渲染之前从外部设置。
  • 那么我们能知道初始值是多少吗?
  • 初始值为零表示纹理00。我已经发布了答案,请阅读。

标签: opengl-es shader webgl


【解决方案1】:

Webgl 有一个术语叫做纹理单元,它是整数。在上面的代码中,您创建了一个采样器,默认单位为 0。这意味着采样器将作用于与 TEXTURE00 关联的纹理。

如果您创建一个纹理对象并在未激活且未与任何纹理单元关联的情况下绑定它,它将被绑定为 TEXTURE_2D,并以 gl.TEXTURE00 作为活动纹理。

假设您创建了一个纹理对象 checkerTexture,它是 TEXTURE0,它位于图像的 ACTIVE_TEXTURE 中,并且纹理对象名称 checkerTexture 位于列表顶部。现在在您的代码中,如果您没有设置统一值(即整数),则默认值为零。这意味着您的着色器将默认采样 checkerTexture。


因此,如果您有多个纹理,并且希望对第二个纹理进行采样并读取数据。如果您没有将统一采样器设置为纹理单元,它将对 TEXTURE00 进行采样,这可能不是每次都需要的情况。

代码如下:

   gl.uniform1i(sampler2dLocation, 1);

这将让您通过该采样器获取第二个纹理对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多