WebGL获取着色器属性失败

着色器源码

<script id="shader-vs" type="x-shader/x-vertex">
    attribute vec3 position;
    attribute vec4 color;
    uniform mat4 uM;
    uniform mat4 uP;
    varying vec4 _color;
    void main(){
        _color = color;
        gl_Position = uP*uM*vec4(position, 1.0);
    }
</script>
<script id="shader-fs" type="x-shader/x-fragment"> 
    precision mediump float;
    varying vec4 _color;
    void main(){
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
    }
</script>

报错信息

WebGL: INVALID_VALUE: vertexAttribPointer: index out of range
WebGL: INVALID_VALUE: enableVertexAttribArray: index out of range

解决方案

// 顶点着色器中使用_color变量
gl_FragColor = _color;

原因:获取不到着色器中未使用的变量

### 如何在Vue.js中使用或集成WebGL 尽管提供的引用主要涉及移动UI库和分析工具[^1][^2],但在Vue.js框架下集成WebGL可以通过多种方式实现。以下是详细的说明: #### 使用Three.js作为中间层 为了简化WebGL开发流程并提供更高级别的抽象接口,通常推荐使用 **Three.js** 库来处理复杂的图形渲染逻辑。 ##### 安装依赖项 通过npm安装`three`包: ```bash npm install three --save ``` ##### 创建组件实例 创建一个基于Vue的自定义组件用于加载和管理Three.js场景。 ```vue <template> <div ref="webglCanvas"></div> </template> <script> import * as THREE from 'three'; export default { name: 'WebGLComponent', mounted() { this.initScene(); }, methods: { initScene() { const scene = new THREE.Scene(); // 初始化场景 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // 设置相机视角 const renderer = new THREE.WebGLRenderer({ antialias: true }); // 渲染器初始化 renderer.setSize(window.innerWidth, window.innerHeight); this.$refs.webglCanvas.appendChild(renderer.domElement); const geometry = new THREE.BoxGeometry(); // 几何体对象 const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube = new THREE.Mesh(geometry, material); // 网格模型对象Mesh scene.add(cube); camera.position.z = 5; function animate() { // 动画函数 requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render(scene, camera); } animate(); } } }; </script> <style scoped> div { width: 100%; height: 100vh; } </style> ``` 此代码片段展示了如何利用 Three.js 和 Vue 的生命周期方法 `mounted()` 来设置 Web GL 场景,并将其附加到 DOM 中的一个容器上[^3]。 #### 手动操作原生WebGL API 如果不需要额外的功能封装或者希望完全控制底层API,则可以直接调用浏览器内置的WebGL上下文来进行绘图工作。 下面是一个简单的例子展示如何手动配置canvas以及绑定着色程序(shaders): ```javascript // 假设我们在某个Vue单文件组件的方法里执行如下脚本... const canvas = document.createElement('canvas'); document.body.appendChild(canvas); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); if (!gl) throw Error('无法获取WebGL context.'); function createShader(gl, type, source){ var shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)){ console.error(`编译失败:\n${source}\n`); return null; } return shader; } let vertexShaderSrc = ` attribute vec4 aVertexPosition; void main(void){ gl_Position=aVertexPosition; }`; let fragmentShaderSrc=`precision mediump float; uniform vec4 uFragColor; void main(void){ gl_FragColor=uFragColor; }`; var program=createProgram(gl,[createShader(gl,gl.VERTEX_SHADER,vertexShaderSrc), createShader(gl,gl.FRAGMENT_SHADER,fragmentShaderSrc)]); if(program===null)return ; // ...继续完成其余部分如缓冲区分配、属性赋值等步骤. ``` 上述过程较为繁琐复杂,因此除非有特殊需求一般建议采用成熟的第三方类库辅助开发[^4]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值