2

我试过了:

#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

问题:有没有办法在执行着色器时使用或直接从纹理中读取像素GL_TEXTURE_2DtexelFetch

4

2 回答 2

5

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

您需要第三个参数。

于 2012-12-11T04:33:05.167 回答
2
texelFetch(sampler1D(0),0,0);

这不是合法的 GLSL。

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

  1. 将其声明为全局范围内的统一变量。
  2. 将其声明为输入函数参数。
  3. 将采样器类型的变量传递给以该采样器类型作为参数的函数。

请注意,“调用构造函数”不在该列表中。sampler1D(0)不是正确的语法。如果要使用采样器,则需要将其声明为统一并从 OpenGL 源代码中设置纹理图像单元。或者使用layout(binding=#)语法,如果你有 GL 4.2 或ARB_shading_language_420pack

真实的是,我想要它的性能。

那么你想要它是出于错误的原因。您使用texelFetchwhentexelFetch最准确地描述了您正在尝试做的事情。它不仅仅是“未经过滤的”;您可以通过正确设置纹理/采样器参数来获得它。当您想要访问特定的纹素时,您应该使用它,而无需纹理坐标归一化等等。

于 2012-12-29T15:17:36.053 回答