我使用的是opengl es 3.0和glsl版本的300es。
我正在尝试用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中计算发光直方图的建议。

最佳答案

纹理点需要是一个带整数纹理坐标(即纹理中的像素位置)的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)像素坐标。(和VBOs)
正如注释中指出的,您需要使用glvertexattribipointer()来提供整数类型。

关于android - 'texelFetch':在OpenGL ES 3.0中找不到匹配的重载函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37519251/

10-12 06:25