如何在GL_TEXTURE_2D中使用texelFetch?

时间:2012-12-11 01:58:49

标签: 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

的行上出错了

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

我没有把这些参数放在我的头上,只有几个来源:

  1. http://www.opengl.org/wiki/Sampler_(GLSL)#Direct_texel_fetches

  2. http://www.opengl.org/sdk/docs/manglsl/xhtml/texelFetch.xml

  3. 问题:有没有办法将GL_TEXTURE_2DtexelFetch一起使用,或者只是在执行着色器时直接读取纹理中的像素?

2 个答案:

答案 0 :(得分:5)

检查1.30 spec,第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) 

您需要第三个参数。

答案 1 :(得分:2)

texelFetch(sampler1D(0),0,0);

这不是合法的GLSL。

sampler1D opaque类型。它没有任何价值。是的,我知道你用glUniform1i“设置”了一个值,但你并没有真正设置一个值。 sampler1D无法构建。这是您可以使用GLSL中的采样器类型执行所有的列表:

  1. 在全球范围内将其声明为统一变量。
  2. 将其声明为输入函数参数。
  3. 将采样器类型的变量传递给将该采样器类型作为参数的函数。
  4. 请注意,“调用构造函数”不在该列表中。 sampler1D(0)语法不正确。如果要使用采样器,则需要将其声明为制服并从OpenGL源代码中设置纹理图像单元。如果您有GL 4.2或ARB_shading_language_420pack,请使用layout(binding=#)语法。

      

    真实的是我想要它的表现。

    然后你出于错误的原因想要它。当texelFetch最准确地描述您要执行的操作时,可以使用texelFetch。它不仅仅是“未经过滤的”;你可以通过设置texture/sampler parameters properly来实现。当您想要访问特定的纹理元素时,应该使用它,而不需要纹理坐标标准化等等。