如何将 texelFetch 与 GL_TEXTURE_2D 一起使用?

问题描述 投票:0回答: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_2D
texelFetch
一起使用,或者在执行着色器时直接从纹理读取像素?

c++ opengl glsl
2个回答
5
投票

检查 1.30 规格,第 89 页。

五个

texelFetch() 重载中的 None

 采用两个参数:

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) 

您需要第三个参数。


2
投票
texelFetch(sampler1D(0),0,0);

这不是合法的 GLSL。

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

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

请注意,“调用构造函数”不在该列表中。

sampler1D(0)
不是正确的语法。如果你想使用采样器,你需要将其声明为uniform并从OpenGL源代码中设置纹理图像单元。或者,如果您有 GL 4.2 或
ARB_shading_language_420pack
,请使用 layout(binding=#) 语法。

事实是我想要它是为了性能。

那么你想要它的原因是错误的。当

texelFetch
最准确地描述了您想要做的事情时,您可以使用
texelFetch
。它不仅是“未经过滤的”,而且是“未经过滤的”。您只需正确设置纹理/采样器参数即可实现这一点。当您想要访问特定纹理元素而不需要纹理坐标归一化等时,您应该使用它。

© www.soinside.com 2019 - 2024. All rights reserved.