如何将texelFetch与GL_TEXTURE_2D一起使用

How to use texelFetch with GL_TEXTURE_2D?

本文关键字:TEXTURE 2D 一起 GL texelFetch      更新时间:2023-10-16

我尝试过:

#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_txel_fetches

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

问题:有没有一种方法可以将GL_TEXTURE_2DtexelFetch一起使用,或者在执行着色器时直接从纹理读取像素?

查看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) 

您需要第三个参数。

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

这不是合法的GLSL。

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

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

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

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

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