gpt4 book ai didi

javascript - 我如何在 webgl 中使用 stride?

转载 作者:行者123 更新时间:2023-11-30 00:10:04 26 4
gpt4 key购买 nike

//Defining geometry
var vertices = [
+0.0,+0.0,+0.0,
+0.0,+0.0,+1.0,

-0.5,+0.0,+0.0,
+1.0,+0.0,+0.0,

-0.5,-0.5,+0.0,
+0.0,+1.0,+0.0,

+0.5,+0.5,+0.0,
+1.0,+0.0,+1.0,

+0.5,+0.0,+0.0,
+1.0,+1.0,+0.0,

-0.5,+0.5,+0.0
+1.0,+0.0,+1.0
];



indices = [3,4,0,0,2,1,5,0,1];

var VextexBuffer = webgl.createBuffer();

webgl.bindBuffer(webgl.ARRAY_BUFFER, VextexBuffer);

webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);

var coord = webgl.getAttribLocation(shaderProgram,"coordinates");

webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,6 * 4,0);

webgl.enableVertexAttribArray(coord);

var color = webgl.getAttribLocation(shaderProgram, "color");

webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,6 * 4,3 * 4);

webgl.enableVertexAttribArray(color);


var IndexBuffer = webgl.createBuffer();

webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, IndexBuffer);

webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), webgl.STATIC_DRAW);

我想在 VertexAttribPointer 方法中使用 stride 来为顶点和颜色数据使用单个 VBO,而不是使用 2 个 VBO,但问题是我不知道 javascript 中 float 的大小。所以我假设它是 4。

现在我收到这个错误:-

**[.CommandBufferContext]GL ERROR :GL_INVALID_OPERATION : glDrawElements:        
attempt to access out of range vertices in attribute 1**

我认为问题在于:-

webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,6 * 4,0);

和:-

webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,6 * 4,3 * 4);

请问是哪里出了问题?谢谢。

最佳答案

在 WebGL 中,FLOAT 的大小为 4。它与数字或 float JavaScript 无关。 JavaScript 中的 float /数字与 WebGL 缓冲区中的 float 是分开的。

您的绘图调用在哪里?从上面的代码中看不出哪里出了问题。一看就对了

在下面测试它我发现 1,问题。您在最后一个坐标和最后一个颜色之间缺少一个逗号,这意味着您的 vertices 数组是一个短值

var webgl = document.querySelector("#c").getContext("webgl");
var shaderProgram = twgl.createProgramFromScripts(webgl, ["vs", "fs"]);
webgl.useProgram(shaderProgram);

//Defining geometry
var vertices = [
+0.0,+0.0,+0.0,
+0.0,+0.0,+1.0,

-0.5,+0.0,+0.0,
+1.0,+0.0,+0.0,

-0.5,-0.5,+0.0,
+0.0,+1.0,+0.0,

+0.5,+0.5,+0.0,
+1.0,+0.0,+1.0,

+0.5,+0.0,+0.0,
+1.0,+1.0,+0.0,

-0.5,+0.5,+0.0,
+1.0,+0.0,+1.0
];


indices = [3,4,0,0,2,1,5,0,1];

var VextexBuffer = webgl.createBuffer();

webgl.bindBuffer(webgl.ARRAY_BUFFER, VextexBuffer);

webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(vertices), webgl.STATIC_DRAW);

var coord = webgl.getAttribLocation(shaderProgram,"coordinates");

webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,6 * 4,0);

webgl.enableVertexAttribArray(coord);

var color = webgl.getAttribLocation(shaderProgram, "color");

webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,6 * 4,3 * 4);

webgl.enableVertexAttribArray(color);


var IndexBuffer = webgl.createBuffer();

webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, IndexBuffer);

webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), webgl.STATIC_DRAW);

webgl.drawElements(webgl.TRIANGLES, 6, webgl.UNSIGNED_SHORT, 0);
<script src="https://twgljs.org/dist/twgl.min.js"></script>
<script id="vs" type="notjs">
attribute vec4 coordinates;
attribute vec4 color;

varying vec4 v_color;

void main() {
gl_Position = coordinates;
v_color = color;
}
</script>
<script id="fs" type="notjs">
precision mediump float;
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
</script>
<canvas id="c"></canvas>

关于javascript - 我如何在 webgl 中使用 stride?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36860325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com