小编Dmi*_*try的帖子

如何包含gl-matrix?

我做了什么:

从此处下载的master分支:https : //github.com/toji/gl-matrix 将src文件夹放入我项目的文件夹中。从那里包括gl-matrix-manifest.js。试过这个:

var mvMatrix = mat4.create();
Run Code Online (Sandbox Code Playgroud)

结果:

var mvMatrix = mat4.create();
ReferenceError: mat4 is not defined
Run Code Online (Sandbox Code Playgroud)

好吧,让我们直接包括mat4。包括在内。结果:

var out = new GLMAT_ARRAY_TYPE(16);
ReferenceError: GLMAT_ARRAY_TYPE is not defined
Run Code Online (Sandbox Code Playgroud)

好的,也许它需要common.js:

var x = axis[0], y = axis[1], z = axis[2],
TypeError: axis is undefined
Run Code Online (Sandbox Code Playgroud)

WTF,包括src文件夹中的所有其他文件(常见,向量,矩阵,quat):

var x = axis[0], y = axis[1], z = axis[2],
TypeError: axis is undefined
Run Code Online (Sandbox Code Playgroud)

(相同)

我如何适当地包括在内?我特别需要mat4和vec4。

javascript math webgl

7
推荐指数
2
解决办法
9534
查看次数

WebGL:将统一数组传递给着色器

试图像这样做:将数组传递给着色器 并像这样:将一组向量传递给一个制服

但仍然没有运气.我想我喜欢那里,但它不起作用:

这是我的JavaScript代码:

shaderProgram.lightsUniform = gl.getUniformLocation(shaderProgram, "lights"); // Getting location
gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); // Let's try to send some light (currently each light is one float) as array.
Run Code Online (Sandbox Code Playgroud)

顶点着色器代码:

uniform float lights[6]; // Declaration

...

vLight *= lights[0]; // Let's try to mutliply our light by the first array item. There should be 3.0.
Run Code Online (Sandbox Code Playgroud)

简介:我将一个数组发送到具有非零浮点数的着色器.

结果:全黑!即灯[0]包含0.0但预期为3.0.如果我尝试灯[1],灯[2]等,它们都会给出相同的结果!

我们现在尝试只传递一个浮点数.我改变

gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); 
Run Code Online (Sandbox Code Playgroud)

gl.uniform1f(shaderProgram.lightsUniform, 3); // I want to send just float 3.0
Run Code Online (Sandbox Code Playgroud)

总结:我发送的只是float 3.0,而不是发送数组.

结果 …

arrays shader glsl uniform webgl

5
推荐指数
1
解决办法
2万
查看次数

WebGL:具有超过4维坐标的顶点缓冲区?

现在我有三个独立的顶点缓冲区:1.XYZ缓冲区2.NX,NY,NZ缓冲区3.紫外缓冲区

所以这是8个浮点数.将来还会添加切线和bitangent信息,所以+6浮点数.

以下是我为着色器声明它们的方法:

shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

shaderProgram.vertexNormalAttribute = gl.getAttribLocation(shaderProgram, "aVertexNormal");
gl.enableVertexAttribArray(shaderProgram.vertexNormalAttribute);

shaderProgram.textureCoordAttribute = gl.getAttribLocation(shaderProgram, "aTextureCoord");
gl.enableVertexAttribArray(shaderProgram.textureCoordAttribute);
Run Code Online (Sandbox Code Playgroud)

在这里,我将它们传递给着色器程序:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexCoordBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexNormalBuffer);
gl.vertexAttribPointer(shaderProgram.vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexTextureCoordBuffer);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);
Run Code Online (Sandbox Code Playgroud)

由于缓冲区是独立的,我可以在着色器中将它们定义为vec3和vec2:

attribute vec3 aVertexPosition;
attribute vec3 aVertexNormal;
attribute vec2 aTextureCoord;
Run Code Online (Sandbox Code Playgroud)

但是,如果我将它们组合到一个缓冲区,每个顶点有8个浮点数呢?所以,项目大小将是8:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexCoordBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 8, gl.FLOAT, false, 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是如何在着色器中访问它们?vec8?有最大的vec4!那我该怎么办?

shader buffer webgl

4
推荐指数
1
解决办法
1832
查看次数

标签 统计

webgl ×3

shader ×2

arrays ×1

buffer ×1

glsl ×1

javascript ×1

math ×1

uniform ×1