【问题标题】:Hardcoding GLSL texture sampler2D硬编码 GLSL 纹理 sampler2D
【发布时间】:2013-09-05 23:14:52
【问题描述】:

在我的片段着色器中,我有一行

gl_FragColor = texture2D(texture, destinationTextureCoordinate) * destinationColor;

其中texturesampler2D 类型的制服。在我的代码中,我总是将其设置为值“0”。

glUniform1i(_uniformTexture, 0);

是否可以跳过对glUniform1i 的调用而只在片段着色器中使用硬核0?我尝试将texture 替换为0,但它抱怨不是有效类型。

【问题讨论】:

    标签: opengl-es glsl


    【解决方案1】:

    我不完全确定您想要实现什么,但这里有一些想法:

    sampler2D 需要对 2D 纹理进行采样,正如其名称所示。它是一个特殊的 GLSL 变量,因此编译器抱怨 0 在输入texture2D 的第一个参数时不是有效类型是正确的。

    除非您使用多个纹理,否则glUniform1i 的第二个参数应始终为0(默认)。如果您只使用单个纹理,则可以跳过此调用,但最好保留它。

    如果您只想传递值 0,为什么需要调用 texture2D?当然你可以做gl_FragColor = destinationColor。这将根据gl_Position 的顶点着色器输出为您的片段着色。如果您不打算使用纹理(或者看起来如此),我不确定您为什么要实现纹理。

    编辑:将两个纹理正确发送到片段着色器的代码。

    //glClear();
    
    // Attach Texture 0
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _texture0);
    glUniform1i(_uSampler0, 0);
    
    // Attach Texture 1
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, _texture1);
    glUniform1i(_uSampler1, 1);
    
    //glDrawArrays();
    

    【讨论】:

    • 我打算一次只使用一个纹理。用0 替换texture 背后的基本原理是_uniformTexturetexture 的位置,而_uniformTexture 位置的值设置为0(通过调用glUniform1i)。不知道为什么这不是更明显。我还尝试将texture 替换为(sampler2D)0,但也没有用。
    • _uniformTexture 只是着色器中sampler2D 变量的句柄。当您通过调用glUniform1i 发送0 时,您实际上只是在告诉采样器从哪里采样,给定一个活动和绑定的纹理(参见上面的代码编辑)。此处的值 0 并不意味着“无样本”,它意味着来自阶段索引 0 的样本。您的纹理到底用于什么?我认为将其设置为 0 没有任何好处。
    • 好像是这样,编码愉快!
    • 只是为了澄清 - 这意味着 GLSL 中的 sampler2D 始终对应于用于绑定纹理的任何 glActiveTexture 并且从不对应于纹理句柄(在您的示例中为“_texture1”)。在 OpenGL 中,您可以在单个 glActiveTexture() 下同时绑定 1D/2D/3D 纹理 - 我认为这在 GLSL 中是不允许的/工作的? (至少我无法让它工作)
    • 我对 OpenGL 不是很熟悉,所以我无法评论 API 的差异。但是,Brad Larson's answer here 可能是对您来说最好的解释。我上面的代码摘录遵循相同的风格和推理。
    【解决方案2】:

    你需要一个布局,像这样:

    #version 420
    //#extension GL_ARB_shading_language_420pack: enable  Use for GLSL versions before 420.
    
    layout(binding=0) uniform sampler2D diffuseTex;
    

    通过这种方式,您将获得与 sampler uniform 0 的绑定。我认为这就是你想要的。但请记住,当您绑定制服时,它们会从零开始递增值,因此请确定您要绑定的内容。通过glUniform1i() 函数绑定统一变量的想法是为了确保代码的正确性。

    来源:http://www.opengl.org/wiki/GLSL_Sampler#Version_4.20_binding

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多