javascript - 修改uniform值时为什么要先使用get Uniform

标签 javascript webgl

我正在阅读《WebGL 初学者指南》一书,其中涉及到通过 keydown 事件更改光线方向的代码:

function processKey(ev){
    var lightDirection = gl.getUniform(prg, prg.uLightDirection);
    var incrAzimuth =   10;
    var incrElevation = 10;

    switch(ev.keyCode){
        case 37: // left arrow
            azimuth -= incrAzimuth;
            break;
        case 38: //up arrow
            elevation += incrElevation;
            break;

        case 39: // right arrow
            azimuth += incrAzimuth;
            break;
        case 40: //down arrow
            elevation -= incrElevation;
            break;
    }

    azimuth %= 360;
    elevation %=360;

    var theta = elevation * Math.PI / 180;
    var phi   = azimuth * Math.PI / 180;

    //Spherical to Cartesian coordinate transformation
    lightDirection[0] = Math.cos(theta)* Math.sin(phi);
    lightDirection[1] = Math.sin(theta);
    lightDirection[2] = Math.cos(theta)* -Math.cos(phi);

    gl.uniform3fv(prg.uLightDirection, lightDirection);
}

看来var lightDirection = gl.getUniform(prg, prg.uLightDirection);没有任何意义,因为

lightDirection[0] = Math.cos(theta)* Math.sin(phi);
lightDirection[1] = Math.sin(theta);
lightDirection[2] = Math.cos(theta)* -Math.cos(phi);`

不通过“lightDirection”进行任何计算,然后将值处理到着色器。

所以我改变了行 var lightDirection = gl.getUniform(prg, prg.uLightDirection);var lightDirection;但程序不能按预期工作。

最佳答案

你不应该。您应该将值缓存在变量中或每次都重新计算。对于您的特定代码,第二个选项非常有效:

function processKey(e) {
    // ...
    var lightDirection = [
        Math.cos(theta)* Math.sin(phi),
        Math.sin(theta),
        Math.cos(theta)* -Math.cos(phi)
    ];
    gl.uniform3fv(prg.uLightDirection, lightDirection);
}

或者甚至使用“uniform3f”并且根本不创建数组:

function processKey(e) {
    // ...
    gl.uniform3f(
        prg.uLightDirection,
        Math.cos(theta)* Math.sin(phi),
        Math.sin(theta),
        Math.cos(theta)* -Math.cos(phi)
    );
}

关于javascript - 修改uniform值时为什么要先使用get Uniform,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44159390/

相关文章:

webgl - 使用 future 进行异步加载

opengl - 与保留模式 OpenGL3 相比,WebGL2 在哪些方面是直接的?

javascript - $compile 显示未捕获的 TypeError : undefined is not a function

javascript - Drupal 以编程方式删除 JavaScript

java - 带有spring或java的骨架.Marionette.js完整教程

多次运行后javascript崩溃

webview - React Native 和 THREE.js(WebGL 库)集成

javascript - 在 HTML 上显示 AngularFireList 数据时出现错误

javascript - PHP 多个查询字符串值到数组

javascript - WebGL 显示加载的没有矩阵的模型