我已经使用WebGL1一段时间了,但是现在我对WebGL2有了更多的了解,我对Vertex Array
实际的工作感到困惑。例如,在下面的示例中,我可以删除对其的所有引用(例如,创建,绑定,删除),并且该示例继续运行。
使用WebGL 2,我们现在可以使用统一缓冲区对象.
它们看起来是个好主意,不必将常见的制服附加到每个程序(如每个被渲染对象共有的投影和视图矩阵).
我创建了一个帮助器类,每次我想绑定一个统一的缓冲区对象时都会调用它.
class UniformBuffer {
constructor(gl, data, boundLocation = 0) {
this.boundLocation = boundLocation;
this.data = new Float32Array(data);
this.buffer = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, this.buffer);
gl.bufferData(gl.UNIFORM_BUFFER, this.data, gl.DYNAMIC_DRAW);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
gl.bindBufferBase(gl.UNIFORM_BUFFER, this.boundLocation, this.buffer);
}
update(gl, data, offset = 0) {
this.data.set(data, offset);
gl.bindBuffer(gl.UNIFORM_BUFFER, this.buffer);
gl.bufferSubData(gl.UNIFORM_BUFFER, 0, this.data, 0, null);
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
gl.bindBufferBase(gl.UNIFORM_BUFFER, this.boundLocation, this.buffer);
}
};
Run Code Online (Sandbox Code Playgroud)
想要创建像这样的统一缓冲区的想法
const perScene = new UniformBuffer(gl, [
...vec4.create(),
...vec4.create(),
], 0); // and bind it to bind location 0?
const perObject = new UniformBuffer(gl, …
Run Code Online (Sandbox Code Playgroud) 当我尝试链接仅附加顶点着色器的 WebGL2 着色器程序时,出现“缺少着色器”错误。我正在尝试使用变换反馈,并且我认为由于顶点着色器的输出已写出,因此不需要片段着色器。
从这篇博文:链接看来您应该能够做到这一点。我缺少的 WebGL 有什么特别之处吗?
我一直在阅读这些示例的源代码,我继续看到这个选项,但是,我无法在任何地方找到这是否是受支持的功能。你只是antialias
通过打开这个标志来获得吗?有关此功能的更多详细信息?
随着我对 WebGL2 的了解越来越多,我在着色器中遇到了这种新语法,您可以通过以下方式在着色器中设置location
:layout (location=0) in vec4 a_Position;
。这attribute
与使用传统gl.getAttribLocation('a_Position');
. 我认为它更快?还有其他原因吗?另外,将位置设置为整数会更好还是也可以使用字符串?
WebGL
具有、、 和用于从着色器内部的纹理读取、GLSL
、和。创建纹理时,我们指定纹理、和。根据OpenGL Sampler Wiki Page,对于给定纹理使用类型不兼容的采样器可能会导致未定义的值。 sampler2D
isampler2D
usampler2D
float
int
unsigned int
WebGL1/2
InternalFormat
Format
Type
是否有一个简单的规则来确定如何将纹理的InternalFormat
、Format
和Type
明确映射到正确的 GLSL 采样器类型?
(不失一般性,我重点关注了,?sampler2D
但当然也有 3D、立方体等纹理,我假设它们遵循完全相同的规则)