'texelFetch':在OpenGL ES 3.0中找不到匹配的重载函数。

5
我正在使用 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中计算亮度直方图。

1个回答

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;
};

但是你需要使用包含所有要包含在直方图中的(x,y)像素坐标的整数来填充“texturePosition”输入数组。 (使用VBOs)。
正如评论中指出的那样,您需要使用glVertexAttribIPointer()来提供整数类型。

谢谢回复 :) 你能提供一些在顶点着色器中进行完整纹理读取的样本吗?(获取顶点着色器中的颜色值) - vishnu dinakaran
现在代码已经编译,但仍未按预期工作。GLES30.glVertexAttribPointer(Handle, 2, **GLES30.GL_INT_VEC2**, false,0, mtextureCoordinates); 这是传递坐标的正确方式吗? - vishnu dinakaran
顺便提一下,您可能需要将gl_Position的x和y坐标都加上0.5,以便绘制的GL_POINT位于像素的中心而不是两个像素之间。 - 246tNt
据我所知,是的。您可以直接使用texture2D(...)而不是texelFetch()。但对于直方图来说可能不太容易,因为您可能希望精确地采样每个像素,而不是进行过滤或类似的操作。 - 246tNt
2
如果您想将整数属性传递给着色器,并在着色器中将它们用作整数类型,则需要使用glVertexAttribIPointer()。请注意函数名称中的额外I - Reto Koradi
显示剩余3条评论

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