【问题标题】:'texelFetch' : no matching overloaded function found in opengl es 3.0'texelFetch' : 在 opengl es 3.0 中找不到匹配的重载函数
【发布时间】:2016-05-30 06:47:28
【问题描述】:

我正在使用 OpenGL es 3.0 和我的 GLSL 版本 #version 300 es

我正在尝试在 GPU 中计算发光直方图。 我已经确定我的设备支持顶点纹理获取并尝试使用 texelFetch 函数读取顶点着色器中的颜色信息。我正在使用 texelFetch,因为我传入每个纹理坐标以便读取每个像素的颜色信息。

附上代码

#version 300 es 
uniform sampler2D imageTexture;
in vec2 texturePosition;
const float SCREEN_WIDTH = 1024.0;
in vec4 position;
vec2 texturePos;
out vec3 colorFactor;
const vec3 W = vec3(0.299, 0.587, 0.114); 
void main() {
    texturePos = texturePosition / SCREEN_WIDTH;
    vec3 color = texelFetch(imageTexture, texturePos.xy,0).rgb;
    float luminance = dot(color.xyz,W);
    colorFactor = vec3(1.0, 1.0, 1.0);
    gl_Position = vec4(-1.0 + (luminance *  0.00784313725), 0.0, 0.0, 1.0);
    gl_PointSize = 1.0;
};

现在收到错误“texelFetch”:找不到匹配的重载函数。

有人可以帮助解决错误并提供建议以在 GPU 中计算发光直方图。

【问题讨论】:

    标签: android opengl-es glsl


    【解决方案1】:

    texturePos 需要是一个 ivec2,具有整数纹理坐标(即纹理中的像素位置)而不是归一化的 [0.0 1.0] 浮点坐标。

    下面的代码应该可以工作:

    #version 300 es 
    uniform sampler2D imageTexture;
    in ivec2 texturePosition;
    in vec4 position;
    out vec3 colorFactor;
    const vec3 W = vec3(0.299, 0.587, 0.114); 
    void main() {
        vec3 color = texelFetch(imageTexture, texturePosition, 0).rgb;
        float luminance = dot(color, W);
        colorFactor = vec3(1.0, 1.0, 1.0);
        gl_Position = vec4(-1.0 + (luminance *  0.00784313725), 0.0, 0.0, 1.0);
        gl_PointSize = 1.0;
    };
    

    但是您需要向“texturePosition”输入数组提供整数,其中包含您希望作为整数包含在直方图中的所有 (x,y) 像素坐标。 (与 VBO)。

    正如 cmets 中所指出的,您需要使用 glVertexAttribIPointer() 来提供整数类型。

    【讨论】:

    • 感谢您的回复 :) 您能否提供在顶点着色器中进行完整纹理读取的任何样本(在顶点着色器中获取颜色值)
    • 现在代码正在编译,但仍然无法正常工作GLES30.glVertexAttribPointer(Handle, 2, **GLES30.GL_INT_VEC2**, false,0, mtextureCoordinates); 这是传递坐标的正确方法吗?
    • 我会使用GLES30.glVertexAttribPointer(Handle, 2, GLES30.GL_INT, false,0, mtextureCoordinates); 当然,该数组需要您手动预填充作为初始化步骤。
    • 附带说明,您可能需要在 gl_Position 的 x 和 y 坐标上都添加 0.5,以便您绘制的 GL_POINT 正好在像素的中心,而不是在两个像素之间。跨度>
    • @vishnudinakaran 如果要将整数属性传递给着色器,并将它们用作着色器中的整数类型,则需要使用glVertexAttribIPointer()。请注意函数名称中的附加 I
    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2020-09-22
    • 2018-04-30
    • 2018-08-01
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多