首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当输入值未更改时,着色器材质是否继续在Three.js中渲染?

当输入值未更改时,着色器材质是否继续在Three.js中渲染?
EN

Stack Overflow用户
提问于 2017-10-15 01:08:55
回答 1查看 164关注 0票数 0

我正在用Three.js在智能手机上编程着色器材质,所以节省图形处理器的性能对我来说至关重要。

情况:

在我的应用程序中,许多平面被设计为UI界面,它们将在开始时或在许多用户交互活动中播放动画(着色器动画)。在动画之后,这些渲染处于“静态”状态(由着色器组合的“静态”图像),不需要在着色器中一次又一次地进行组合(是的,它会渲染,这里的“UIes”是指“着色器多纹理,或程序组合”)。如果不能停止这些无意义的渲染,它将消耗很大比例的GPU性能。

问题:

正如我们所知道的,当着色器材质的任何输入值发生更改时,无论"needupdate“是否为"false”,webGLRender都将更新输出材质。

但是,如果制服的输入值没有更改,webGLRender是否会再次渲染它,或者只是放弃渲染?这是问题1。

我读过"webGLRender.js“代码,理解不好,仍然不太确定着色器材质是如何渲染的。(从代码中,我相信它会继续渲染,但不是很确定)。

问题2:如果webGLRender继续渲染着色器材质,即使输入值没有更改,是否有方法可以停止webGLRender渲染“未更改”的着色器材质,以节省GPU性能?

下面是我的简单测试:

fragmentShader:

代码语言:javascript
复制
uniform float col; 
void main() {
   gl_FragColor = vec4(col, 0.58, 0.06, 1.0);
} 

vertexShader:

代码语言:javascript
复制
void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position.x+5.0, position.y, position.z+25.0, 1.0); 
}

Javascript代码:

代码语言:javascript
复制
var cube1, geo1, mat1;

function newbox2(){
    geo1 = new THREE.BoxGeometry(12, 4, 2);

    mat1 = new THREE.ShaderMaterial( {
        uniforms: {
            col: { type: 'f', value: 1.0 },
        },
        vertexShader: "void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position.x+5.0, position.y, position.z+25.0, 1.0); }",
        fragmentShader: "uniform float col; void main() {gl_FragColor = vec4(col, 0.58, 0.06, 1.0);}"
    });

    cube1 = new THREE.Mesh(geo1, mat1);
    scene.add(cube1);   

    cube1.position.set(5, 5, 10);
}

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-10-15 09:00:58

  1. 如果您有任何类型的运动、动画、环绕控件和循环,渲染器将渲染每一帧的所有内容。即使你的相机改变位置也被认为是改变了着色器的“输入值”(uniforms).
  2. the实现这种效果的唯一方法就是不再渲染。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46747194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档