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 个维度:sampler1D
、sampler2D
和sampler3D
。
但是,当我尝试在 Chrome(常规和 Canary 中)中使用 WebGL 编译 GLSL 程序时,sampler2D
和 sampler3D
被接受,但 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/… 这表明sampler1D
和sampler3D
都是关键字“保留供将来使用。使用它们会导致错误。”
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?的主要内容,如果未能解决你的问题,请参考以下文章