WebGL 不喜欢带有索引绘图的 Index 255

问题描述 投票:0回答:1

这是一个最小的 WebGL 测试程序,它创建一个具有单个 uint8 值 255 的索引缓冲区。它应该绘制一个大小为 64px 的红色正方形,但事实并非如此(索引值对于绘制来说并不重要)。

不知何故,WebGL 会忽略索引为 255 的元素,尽管它适合无符号字节范围。使用 254 或其他值,红色方块将按预期显示。

这是 WebGL 的错误还是预期的行为?我找不到任何相关内容。

<canvas width="800" height="600"></canvas>
<script type="module">
let canvas = document.querySelector("canvas");
let gl = canvas.getContext("webgl2", {antialias: false});
let vert = gl.createShader(gl.VERTEX_SHADER);
let frag = gl.createShader(gl.FRAGMENT_SHADER);
let prog = gl.createProgram();
let index_buf = gl.createBuffer();

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buf);

gl.bufferData(
    gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([255]), gl.STATIC_DRAW
);

gl.shaderSource(vert, `#version 300 es
    void main()
    {
        gl_Position = vec4(pos, 1);
        gl_PointSize = 64.0;
    }
`);

gl.shaderSource(frag, `#version 300 es
    precision highp float;
    out vec4 color;
    void main()
    {
        color = vec4(1,0,0,1);
    }
`);

gl.compileShader(vert);
gl.compileShader(frag);
gl.attachShader(prog, vert);
gl.attachShader(prog, frag);
gl.linkProgram(prog);
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.useProgram(prog);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buf);
gl.drawElements(gl.POINTS, 1, gl.UNSIGNED_BYTE, 0);
</script>
javascript webgl webgl2
1个回答
1
投票

请参阅 WebGL 2.0 规范 - PRIMITIVE_RESTART_FIXED_INDEX 始终启用

在 OpenGL ES 3.0 中通过启用/禁用控制的 PRIMITIVE_RESTART_FIXED_INDEX 上下文状态在 WebGL 2.0 中不受支持。相反,WebGL 2.0 的行为就好像此状态始终处于启用状态。这是与 WebGL 1.0 相比的兼容性差异。

当drawElements、drawElementsInstanced或drawRangeElements处理索引时,如果索引的值为该数据类型的最大值(对于UNSIGNED_BYTE索引为255,对于UNSIGNED_SHORT为65535,或者对于UNSIGNED_INT为4294967295),...

因此,如果索引类型为

UNSIGNED_BYTE
,则索引 255 是原始重启索引,不能用于索引顶点。

© www.soinside.com 2019 - 2024. All rights reserved.