GLSL:无法找到兼容的重载函数。

5
我正在尝试编写一个片段着色器,但遇到了困难。这是我第二次编写着色器,所以我很新,几乎可以确定我只是没有正确处理数据类型,这就是错误的根源,但是我无论如何都不能解决它。目标是能够将纹理传递给函数,以便我可以一遍又一遍地调用它...任何帮助都将不胜感激! 我得到的错误是:error 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);
}
1个回答

6
作为错误信息提示,没有texture2D重载函数接受一个vec3作为第一个参数和一个vec2作为第二个参数。 texture2D的第一个参数必须是sampler2D类型。

实际上你在代码中使用texture2D(RTScene, vec2(vTexCoord.x, vTexCoord.y))告诉OpenGL去查找纹理RTScene中位置为vec2(vTexCoord.x, vTexCoord.y)的颜色值。但是由于RTScene只是一个包含三个浮点数(你在main中检索到的RGB值)的vec3,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
@NumbThumb 是的,抱歉打错了。我已经更正了。 - t.niese
我还有一个问题。当我尝试将结果传递给另一个函数时,该函数与水平传递相同,但是我收到了有关参数“tex”类型不兼容的错误。我正在尝试执行以下操作:vec4 pass1 = hblur(image,uv); vec4 pass2 = vblur(pass1,uv); - NumbThumb
@NumbThumb 因为 pass1 是一个 vec4 而不是一个 sampler2D。当你想要进行高斯模糊时,你还需要先进行两次模糊,例如水平方向和垂直方向,或者反过来。 - t.niese
我早就想到了,谢谢。也许我在尝试在一个着色器中完成两个通道时让自己变得更加困难。我想这甚至是不可能的。我的逻辑是,我首先会进行水平模糊,然后进行垂直模糊,然后再通过水平和垂直通道来获得更平滑的结果。我的想法完全错误吗? - NumbThumb
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接