我的顶点着色器具有以下属性:
属性float a_color;
我有一个数组缓冲区(WebAssembly的内存),它只包含0和1,我通过创建一个Uint8阵列
。然而,我的顶点着色器忽略了它(没有错误,但似乎将所有内容都视为0)。我正在使用twgl公司
。这是我的代码:
顶点着色器:
属性vec2 a_position;属性float a_color;均匀vec2u_resolution;均匀浮点u_point_width;可变vec4 v颜色;vec2 normalize_coords(vec2位置){浮子x=位置[0];浮子y=位置[1];float resx=u_resolution[0];float resy=u_resolution[1];返回vec2(2.0*x/resx-1.0,2.0*y/resy-1.0);}空main(){gl_PointSize=u_point_width;vec2坐标=normalize_coords(a_position);gl_Position=vec4(坐标*vec2(1,-1),0,1);v颜色=vec4(0,a颜色,0,1);}
碎片着色器:
高精度浮点;可变vec4 v颜色;空main(){gl_FragColor=v_color;}
Java脚本:
const canvas=文档.getElementById(“c”);常量单元格大小=10;const gl=canvas.getContext(“webgl”);const programInfo=twgl.createProgramInfo(gl[“顶点着色器”,“碎片阴影”]);twgl.setDefaults({attribPrefix:“a_”});twgl.resizeCanvasToDisplaySize(gl.canvas,window.devicePixelRatio);gl.视口(0,0,gl.canvas.width,gl.cavas.height);const universe=universe.new(数学细胞(gl.canvas.width/CELL_SIZE/2),数学细胞(gl.canvas.height/CELL_SIZE/2));const width=universe.width();const height=universe.height();设点=[];for(设i=0;i<宽度;i++){for(设j=0;j<高度;j++){点push([i*CELL_SIZE*2,j*CELLS_SIZE*2]);}}const cellsPtr=universe.cells();//Web程序集内存(仅0和1)const cells=新Uint8Array(memory.buffer,cellsPtr,width*height);常量数组={位置:{数据:新的Float32Array(points.flat()),大小:2},颜色:{数据:单元格,尺寸:1,类型:gl.UNSIGNED_BYTE}};const bufferInfo=twgl.createBufferInfoFromArrays(gl,数组);const制服={u_resolution:[gl.canvas.width,gl.cavas.height],u_point_width:单元格大小};gl.清除颜色(0,0,0,1);全局清除(全局COLOR_BUFFER_BIT);gl.useProgram(programInfo.program);twgl.setUniforms(programInfo,制服);twgl.setBuffersAndAttributes(gl,programInfo,bufferInfo);twgl.drawBufferInfo(gl,缓冲信息,gl.POINTS);函数renderLoop(时间){twgl.resizeCanvasToDisplaySize(gl.canvas,window.devicePixelRatio);gl.视口(0,0,gl.canvas.width,gl.cavas.height);universe.tick();const cellsPtr=universe.cells();const cells=新Uint8Array(内存缓冲区,单元格Ptr,宽度*高度);const制服={u_resolution:[gl.canvas.width,gl.cavas.height],u_point_width:单元格大小};gl.清除颜色(0,0,0,1);全局清除(全局COLOR_BUFFER_BIT);gl.useProgram(programInfo.program);twgl.setUniforms(programInfo,制服);twgl.setAttribInfoBufferFromArray(gl,缓冲区信息.attribs.a_color{数据:单元格,尺寸:1,类型:gl.UNSIGNED_BYTE}); // 使用新颜色动态更新缓冲区twgl.setBuffersAndAttributes(gl,programInfo,bufferInfo);twgl.drawBufferInfo(gl,缓冲信息,gl.POINTS);请求动画帧(renderLoop);}requestAnimationFrame(renderLoop);};
如果手动转换,我没有问题细胞
到Float32数组
.我做错什么了吗?
下面是上述代码的实时简化版本(屏幕上应该有绿色点,但没有):
https://codesandbox.io/ssilly-jackson-ut3wm