首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在webgl中使用stride?

如何在webgl中使用stride?
EN

Stack Overflow用户
提问于 2016-04-26 09:08:18
回答 1查看 3.1K关注 0票数 3
代码语言:javascript
复制
//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中浮动的大小。所以我以为是4。

现在我发现了一个错误:-

代码语言:javascript
复制
**[.CommandBufferContext]GL ERROR :GL_INVALID_OPERATION : glDrawElements:        
attempt to access out of range vertices in attribute 1**

我认为问题在于:-

代码语言:javascript
复制
webgl.vertexAttribPointer(coord, 3, webgl.FLOAT, false ,6 * 4,0);

以及:-

代码语言:javascript
复制
webgl.vertexAttribPointer(color, 3, webgl.FLOAT, false ,6 * 4,3 * 4);

请告诉我哪里有错?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 11:26:36

浮动的大小在WebGL中是4。它与数字或浮点数JavaScript无关。JavaScript中的浮点数与WebGL缓冲区中的浮点数是分开的。

你的抽奖电话呢?从上面的代码中还不清楚出了什么问题。一眼看上去是对的

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

代码语言:javascript
复制
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);
代码语言:javascript
复制
<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>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36860325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档