WebGL 2.0 GLSL 在使用 sampler3D 时遇到语法错误

Syntax error encountered in WebGL 2.0 GLSL when using sampler3D

我正在尝试使用 WebGL 2.0 在浏览器中呈现 3D 医疗数据。

AFAIK 3D 纹理现在在 WebGL 2.0 中得到支持。

texImage3D() 是公认的函数调用。

我正在编写片段着色器并声明统一采样器:

uniform sampler3D samp;

当我在 Firefox 上 运行 时,出现错误:

uncaught exception: Shader compile error: ERROR: 0:19: 'sampler3D' : Illegal use of reserved word ERROR: 0:19: 'sampler3D' : syntax error

当我使用 sampler2D 时工作正常(虽然没有解决我的目的)。

任何人都可以指出我在这里做错了什么吗?

还不支持sampler3D吗? 但是在那种情况下,应该如何访问使用 texImage3D() 加载的任何纹理?

您是否更改了所有需要更改的内容以使用 sampler3D 等 WebGL 2.0 功能?

要使用 sampler3D,您需要添加

#version 300 es

到着色器的顶部。 它必须是第一行,前面没有空格

请注意,从 GLSL 1.0 到 GLSL 3.00 还有许多其他更改

在这里测试

"use strict";

const vs = `#version 300 es

in vec4 position;

void main() {
  gl_Position = position;
}
`;

const fs = `#version 300 es
precision mediump float;
precision lowp sampler3D;

uniform sampler3D u_someTexture;

out vec4 theColor;

void main() {
  theColor = texture(u_someTexture, vec3(0,0,0));
}
`;

function main() {
  var m4 = twgl.m4;
  var gl = twgl.getContext(document.createElement("canvas"));
  log("using: " + gl.getParameter(gl.VERSION));  
  if (!twgl.isWebGL2(gl)) {
    log("Sorry, this example requires WebGL 2.0");  
    return;
  }

  var programInfo = twgl.createProgramInfo(gl, [vs, fs], (err) => {
    log("could not compile shader: " + err);
  });
  if (programInfo) {
    log("compiled shader with sampler3D");
  }

}
main();

function log() {
  var elem = document.createElement("pre");
  elem.appendChild(document.createTextNode(Array.prototype.join.call(arguments, " ")));
  document.body.appendChild(elem);
}
<script src="https://twgljs.org/dist/twgl-full.min.js"></script>