我正在尝试编写一个片段着色器,但遇到了困难。这只是我的第二个着色器,所以我对此非常陌生,我几乎可以肯定我只是没有正确处理数据类型,这就是错误的来源,但对于我的一生来说,我似乎无法要解决这个问题。目标是能够将纹理传递给函数,以便我可以一次又一次地调用它......任何和所有帮助将不胜感激!
我得到的错误是:错误 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);
}
Run Code Online (Sandbox Code Playgroud)
正如错误消息告诉您的那样,不存在需要 a作为第一个参数和 a作为第二个参数texture2D的重载。的第一个参数必须是 类型的。vec3vec2texture2Dsampler2D
从字面上看,您在代码中告诉 OpenGL在纹理中的texture2D(RTScene, vec2(vTexCoord.x, vTexCoord.y))位置查找颜色。但由于它只是包含三个浮点(您在 中检索的 rgb 值),OpenGL 应该在哪里找到像素。vec2(vTexCoord.x, vTexCoord.y)RTSceneRTScenevec3main
在你的主代码中你会有这样的东西:
vec4 work = hblur(image, uv);
Run Code Online (Sandbox Code Playgroud)
你的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
}
Run Code Online (Sandbox Code Playgroud)
查看您正在编码的 OpenGL 版本的 OpenGL 快速参考卡总是很有帮助的,在那里您可以快速概述可用的功能: