我试过了:
#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)”。
我没有把这些参数放在我的头上,只有几个来源:
http://www.opengl.org/wiki/Sampler_(GLSL)#Direct_texel_fetches
问题:有没有办法将GL_TEXTURE_2D
与texelFetch
一起使用,或者只是在执行着色器时直接读取纹理中的像素?
答案 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中的采样器类型执行所有的列表:
请注意,“调用构造函数”不在该列表中。 sampler1D(0)
语法不正确。如果要使用采样器,则需要将其声明为制服并从OpenGL源代码中设置纹理图像单元。如果您有GL 4.2或ARB_shading_language_420pack,请使用layout(binding=#)
语法。
真实的是我想要它的表现。
然后你出于错误的原因想要它。当texelFetch
最准确地描述您要执行的操作时,可以使用texelFetch
。它不仅仅是“未经过滤的”;你可以通过设置texture/sampler parameters properly来实现。当您想要访问特定的纹理元素时,应该使用它,而不需要纹理坐标标准化等等。