【问题标题】:GLSL: Unable to find compatible overloaded functionGLSL:找不到兼容的重载函数
【发布时间】:2014-03-21 20:28:51
【问题描述】:

我正在尝试编写片段着色器,但我碰壁了。这只是我的第二个着色器,所以我对此很陌生,我几乎可以肯定我只是没有正确处理数据类型,这就是错误的来源,但对于我的生活,我似乎无法要解决这个问题。目标是能够将纹理传递给函数,以便我可以一次又一次地调用它......任何和所有帮助将不胜感激!

我得到的错误是:错误 C1115: 无法找到兼容的重载函数“texture2D(vec3, vec2)”。

uniform sampler2D image;
uniform float radius;
uniform float adsk_result_w, adsk_result_h;

vec2 iResolution = vec2(adsk_result_w, adsk_result_h);
vec2 uv=(gl_FragCoord.xy/iResolution.xy);
vec2 vTexCoord = (gl_FragCoord.xy/iResolution.xy);
float blurSize = radius/iResolution;

vec4 hblur(vec4 frontin ) {
    vec3 RTScene = frontin.rgb;
    vec4 sum = vec4(0.0);
    sum += texture2D(RTScene, vec2(vTexCoord.x - 4.0*blurSize, vTexCoord.y)) * 0.05;
    sum += texture2D(RTScene, vec2(vTexCoord.x - 3.0*blurSize, vTexCoord.y)) * 0.09;
    sum += texture2D(RTScene, vec2(vTexCoord.x - 2.0*blurSize, vTexCoord.y)) * 0.12;
    sum += texture2D(RTScene, vec2(vTexCoord.x - blurSize, vTexCoord.y)) * 0.15;
    sum += texture2D(RTScene, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
    sum += texture2D(RTScene, vec2(vTexCoord.x + blurSize, vTexCoord.y)) * 0.15;
    sum += texture2D(RTScene, vec2(vTexCoord.x + 2.0*blurSize, vTexCoord.y)) * 0.12;
    sum += texture2D(RTScene, vec2(vTexCoord.x + 3.0*blurSize, vTexCoord.y)) * 0.09;
    sum += texture2D(RTScene, vec2(vTexCoord.x + 4.0*blurSize, vTexCoord.y)) * 0.05;
return vec4(sum);
}

void main() {
    vec4 front = texture2D(image, uv);
    vec4 work = hblur(front);

    gl_FragColor = vec4(work);
}

【问题讨论】:

    标签: glsl


    【解决方案1】:

    正如错误消息告诉您的那样,没有 texture2D 重载需要 vec3 作为第一个参数,vec2 作为第二个参数。 texture2D 的第一个参数必须是 sampler2D 类型。

    从字面上看,您在代码中使用 texture2D(RTScene, vec2(vTexCoord.x, vTexCoord.y)) 告诉 OpenGL 在纹理 RTScene 中的位置 vec2(vTexCoord.x, vTexCoord.y) 处查找颜色。但是由于RTScene 只是一个包含三个浮点数的vec3(您在main 中检索到的rgb 值),OpenGL 应该在哪里找到像素。

    在您的主代码中,您将拥有如下内容:

    vec4 work = hblur(image, uv);
    

    你的hblur 应该是这样的:

    vec4 hblur(sampler2D tex, vec2 uv) {
        // your other code
        sum += texture2D(tex, vec2(uv.x - 4.0*blurSize, uv.y)) * 0.05;
        // your other code
    }
    

    查看您正在编码的 OpenGL 版本的 OpenGL 快速参考卡总是很有帮助的,在那里您将快速了解可用功能:

    【讨论】:

    • 非常感谢!一旦我将“sample2D”更改为“sampler2D”,这就成功了。非常感谢!
    • @NumbThumb 是的,抱歉打错了。我已经更正了。
    • 我还有最后一期。当我尝试将该结果传递给另一个相同的函数时,但对于垂直传递,我收到有关参数“tex”类型不兼容的错误。我正在尝试执行以下操作: vec4 pass1 = hblur(image, uv); vec4 pass2 = vblur(pass1, uv);
    • @NumbThumb 因为pass1vec4 而不是sampler2D。当您想做高斯模糊时,您还需要先进行两次模糊,例如水平然后垂直或相反。
    • 我想了很多,谢谢。也许我让自己在一个着色器中尝试同时进行两次传递变得更加困难。我想这甚至是不可能的。我的逻辑是,我首先进行水平模糊,然后进行垂直模糊,然后将其穿过水平,然后再次垂直,以获得更平滑的结果。我的想法完全错了吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多