C++ 如何将texelFetch与GL_纹理_2D一起使用?

C++ 如何将texelFetch与GL_纹理_2D一起使用?,c++,opengl,glsl,C++,Opengl,Glsl,我试过: #version 130 uniform sampler2D texID; in vec2 texcoord; out vec4 outcolor; void main(void) { vec2 tcoord=texcoord.xy*768.0; ivec2 tst=ivec2(tcoord.x,tcoord.y); outcolor=texelFetch(texID,tcoord); } 并在带有texelFetch的行中出错: 找不到兼容的重载函数“t

我试过:

#version 130

uniform sampler2D texID;
in vec2 texcoord;
out vec4 outcolor;

void main(void) {
    vec2 tcoord=texcoord.xy*768.0;
    ivec2 tst=ivec2(tcoord.x,tcoord.y);
    outcolor=texelFetch(texID,tcoord);
}
并在带有
texelFetch
的行中出错:

找不到兼容的重载函数“texelFetch(sampler2D,vec2)”

我没有把这些参数从我的头脑中放在这里,有几个来源:

  • 问题:有没有办法将
    GL\u TEXTURE\u 2D
    texelFetch
    一起使用,或者在执行着色器时直接从纹理读取像素?

    检查第89页

    五个
    texelFetch()
    重载中有两个参数:

    gvec4 texelFetch (gsampler1D sampler, int P, int lod) 
    gvec4 texelFetch (gsampler2D sampler, ivec2 P, int lod) 
    gvec4 texelFetch (gsampler3D sampler, ivec3 P, int lod) 
    gvec4 texelFetch (gsampler1DArray sampler, ivec2 P, int lod) 
    gvec4 texelFetch (gsampler2DArray sampler, ivec3 P, int lod) 
    
    您需要第三个参数

    texelFetch(sampler1D(0),0,0);
    
    这不是合法的GLSL

    sampler1D
    是不透明类型。它没有任何价值。是的,我知道你用
    glUniform1i
    来“设置”一个值,但你并没有真正设置一个值<无法构造代码>采样器1d。这是一个列表,列出了在GLSL中使用采样器类型可以执行的所有操作:

  • 在全局范围内将其声明为统一变量
  • 将其声明为输入函数参数
  • 将采样器类型的变量传递给将该采样器类型作为参数的函数
  • 请注意,“调用构造函数”不在该列表中<代码>采样器1D(0)语法不正确。如果要使用采样器,需要将其声明为统一的,并从OpenGL源代码中设置纹理图像单位。或者使用
    布局(binding=#)
    语法,如果您有GL 4.2或

    事实是,我想要它的性能


    那么你想要它的理由是错误的。当
    texelFetch
    最准确地描述您要做的事情时,您可以使用
    texelFetch
    。它不仅仅是“未经过滤的”;您只需设置。当您想要访问特定的texel时,应该使用它,而不需要纹理坐标标准化等等。

    刚刚测试的
    texelFetch(sampler1D(0),0,0)
    和get
    无法再次找到兼容的重载函数
    。我的GPU太旧了?(Opengl 2.0\DirectX 9)取决于。通过Cg编译器检查
    glGetString(GL\u SHADING\u LANGUAGE\u版本)
    1.20 NVIDIA的值。没关系啊哈?你会注意到
    1.20
    小于
    1.30
    。如果没有带过滤器的功能,难道没有读取纹理像素的功能吗?