nVidia GLSL 不支持 sampler1D?

Posted

技术标签:

【中文标题】nVidia GLSL 不支持 sampler1D?【英文标题】:sampler1D not supported in nVidia GLSL? 【发布时间】:2011-09-06 19:03:36 【问题描述】:

在GLSL spec 和other sources about GLSL 中,采样器类型有3 个维度:sampler1Dsampler2Dsampler3D

但是,当我尝试在 Chrome(常规和 Canary 中)中使用 WebGL 编译 GLSL 程序时,sampler2Dsampler3D 被接受,但 sampler1D 给出了语法错误。代码:

uniform sampler1D tex1;

错误:

FS ERROR: ERROR: 0:9: 'sampler1D' : syntax error 

即使我给 Canary 提供命令行参数 --use-gl=desktop,也会出现此错误。

我正在运行 Chrome 12.0.742.68 beta-m 和 Canary 13.0.782.1。 我的芯片组是 Nvidia Quadro NVS 160M。

Nvidia 是否有可能允许 2 维和 3 维纹理采样器,但不允许 1D?我已经尝试搜索相关信息,但没有找到任何信息。

【问题讨论】:

【参考方案1】:

不,您的问题与“NVIDIA GLSL”无关。 WebGL 基于 OpenGL ES 2.0,而 OpenGL ES 2.0 没有 1D 纹理,只有 2D 和 3D 纹理(作为扩展),因此您将无法在 WebGL 中使用 sampler1D。

解决方案?只需将高度为 1 的 2D 纹理与 sampler2D 一起使用。

注意:如果您使用桌面 OpenGL (OpenGL >= 2.0),您将能够使用 1D 纹理和 sampler1D。

【讨论】:

果然,你是对的。对于其他感兴趣的人,GLSL ES 2.0 规范在这里:khronos.org/registry/gles/specs/2.0/… 这表明sampler1Dsampler3D 都是关键字“保留供将来使用。使用它们会导致错误。” 2D 纹理是正方形的,因此高度为 1 的纹理也具有宽度 1。您需要一个 2DRect 纹理,它与 1D 纹理一样,在桌面 GL 中可用,但在没有扩展名的 GLES 中不可用 @Chris 不,我认为 2D 纹理不必是方形的,至少如果支持 NPOT 纹理。没有理由使用矩形纹理。虽然我不知道 ES 处理这个是否与桌面不同。 @ChristianRau NPOT 纹理在 OpenGL ES 2.0 中始终受支持,尽管 mipmapping 和边框环绕选项有所减少。引用 Gold Book(OpenGL ES 2.0 Programming Guide),“...对于 npot 纹理,包裹模式只能是 GL_CLAMP_TO_EDGE 并且缩小过滤器只能是 GL_NEAREST 或 GL_LINEAR(换句话说,不是 mipmapped)。扩展 GL_OES_texture_npot放宽了这些限制,允许 GL_REPEAT 和 GL_MIRRORED_REPEAT 的环绕模式,还允许使用全套缩小过滤器对 npot 纹理进行 mipmap。”【参考方案2】:

使用高度为 1 的 OpenGL 纹理 2D 对象的示例:

glTexStorage2D(GL_TEXTURE_2D, 8, GL_RGB8, 256, 1);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGB, GL_UNSIGNED_BYTE, palette);

以及在GLSL中对应的调用,使用名为“tex”的sampler2D对象:

vec4 color = texture(tex, vec2(x, 1.0f));\n"

【讨论】:

以上是关于nVidia GLSL 不支持 sampler1D?的主要内容,如果未能解决你的问题,请参考以下文章

默认的 GLSL 着色器是啥样的?对于版本 330

GLSL 扩展在应该可用时不可用

不支持 GLSL 330 内核

不支持 GLSL 1.30

OpenGL 2D纹理单元&纹理翻转解决策略

openGL之API学习(一七七)opengl gles glsl glsl es版本对应关系