IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> WebGL中,如何通过javascript来修改着色器的数据。 -> 正文阅读

[游戏开发]WebGL中,如何通过javascript来修改着色器的数据。

1.WebGL中,如何通过javascript来修改着色器的数据。

1.在对应的着色器中,将需要通过js修改的数据,使用attribute来声明
2.通过gl.getAttribLocation()来获取,attribute声明的变量的地址。
3.通过gl.vertexAttrib3f()来修改对应的新的值

在对应的着色器中,将需要通过js修改的数据,使用attribute来声明。
以顶点着色器为例。

const VSHADER_SOURCE = 
        'attribute vec4 a_Position;\n'+
        'void main() { \n'+
        '   gl_Position = a_Position;\n'+
        '   gl_PointSize = 5.0;\n'+
        '}\n';

attribute vec4 a_Position
a_Position变量是通过 atribute声明的。

2.通过gl.getAttribLocation()来获取,attribute声明的变量的地址。

const a_Position = gl.getAttribLocation(gl.program, 'a_Position');

获取存储地址

3.通过gl.vertexAttrib3f()来修改对应的新的值

gl.vertexAttrib3f(a_Position, '0', '0', '0');

修改对应的值。

最后重新渲染

gl.clearColor(0.0,0.0,0.0,1.0)
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.POINTS,0,1);

3.案例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #canvas {
            height:400px;
            width: 400px;
            /* background-color: red; */
        }
    </style>
</head>
<body>
    <input type="number" id="value1" />
    <input type="number" id="value2" />
    <input type="number" id="value3" />
    <button id="btn">确定</button>
    <canvas id="canvas"></canvas>
    <script>
        const VSHADER_SOURCE = 
        'attribute vec4 a_Position;\n'+
        'void main() { \n'+
        '   gl_Position = a_Position;\n'+
        '   gl_PointSize = 5.0;\n'+
        '}\n';
        const FSHADER_SOURCE = 
        'void main() { \n' +
        '   gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n' +
        '}\n';
        // console.log(canvas, 'canvas')
        const gl = canvas.getContext('webgl');
        // console.log(gl.createShader, 'sdf')
        function createshader(gl, type, source) {
            const shader = gl.createShader(type)
            gl.shaderSource(shader, source);
            gl.compileShader(shader);
            const compileState = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
            if (!compileState) {
                // console.log(source, 'type')
                const err = gl.getShaderInfoLog(shader);
                console.log('编译报错的信息为'+err);
                gl.deleteShader(shader); // 删除对应的着色器。
                return null
            }
            return shader;
        }
        function createProgram(gl,vshader, fshader) {
            const vertexShader = createshader(gl, gl.VERTEX_SHADER, vshader);
            const fragmentShader = createshader(gl, gl.FRAGMENT_SHADER, fshader);
            if (!fragmentShader && !vertexShader) {
                console.log('创建着色器报错');
                return null
            }
            const program = gl.createProgram();
            gl.attachShader(program, vertexShader);
            gl.attachShader(program, fragmentShader);
            gl.linkProgram(program);
            const linkState = gl.getProgramParameter(program, gl.LINK_STATUS);
            if (!linkState) {
                const err = gl.getProgramInfoLog(program);
                console.log('链接报错的信息为:'+err);
                gl.deleteShader(vertexShader);
                gl.deleteShader(fragmentShader);
                gl.deleteProgram(program);
                return null;
            }
            return program;

        }
        function initShader() {
            const program = createProgram(gl, VSHADER_SOURCE, FSHADER_SOURCE);
            if (!program) {
                console.log('创建失败');
                return false;
            }
            gl.useProgram(program);
            gl.program = program;
        }
        initShader();
        const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
        gl.vertexAttrib3f(a_Position, '0', '0', '0');
        gl.clearColor(0.0,0.0,1.0,1.0)
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.POINTS, 0, 1)
        let x = 0
        value1.addEventListener('change',function(){
            x = this.value / 10;
            console.log(y, 'yyy')
            // drawarrays(Math.abs(parseInt(this.value) / 10), '1', '0')
            drawarrays(this.value / 10, y, '0')
        })
        let y = 0
        value2.addEventListener('change',function(){
            y = this.value / 10;
            // drawarrays(0, Math.abs(parseInt(this.value) / 10), '0')
            drawarrays(x, this.value / 10, '0')
        })
        value3.addEventListener('change',function(){
            // drawarrays(0, '1', Math.abs(parseInt(this.value) / 10))
            drawarrays(0, '1', this.value / 10)

        })
        function drawarrays(x,y,z) {
            gl.vertexAttrib3f(a_Position,x,y,z)
            gl.clearColor(0.0,0.0,0.0,1.0)
            gl.clear(gl.COLOR_BUFFER_BIT);
            gl.drawArrays(gl.POINTS,0,1);
        }
    </script>
</body>
</html>

运行的界面:
在这里插入图片描述
功能点:
点击可以改变红点的位置.

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:17:37  更:2021-11-24 08:18:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 23:30:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码