WebGL unterstützt keine Indexzeichnung mit Index 255
P粉265724930
2023-08-17 12:37:59
<p>Dies ist das einfachste WebGL-Testprogramm, das einen Indexpuffer mit nur einem uint8-Wert von 255 erstellt. Es sollte ein rotes Quadrat mit einer Größe von 64 Pixeln gezeichnet werden, aber das ist nicht der Fall (der Indexwert spielt für das Zeichnen keine Rolle). </p>
<p>Irgendwie ignoriert WebGL das Element bei Index 255, obwohl es im vorzeichenlosen Bytebereich liegt. Bei 254 oder anderen Werten erscheint das rote Quadrat wie erwartet. </p>
<p>Ist das ein Fehler in WebGL oder erwartetes Verhalten? Ich kann keine relevanten Informationen finden. </p>
<pre class="brush:php;toolbar:false;"><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, neues 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
Präzisions-Hochschwimmer;
aus vec4 Farbe;
void main()
{
Farbe = 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></pre>
<p><br /></p>
查看WebGL 2.0规范 - PRIMITIVE_RESTART_FIXED_INDEX始终启用:
因此,如果索引类型是
UNSIGNED_BYTE
,索引255是原始重启索引,不能用于索引顶点。