我正在用Three.js在智能手机上编程着色器材质,所以节省图形处理器的性能对我来说至关重要。
情况:
在我的应用程序中,许多平面被设计为UI界面,它们将在开始时或在许多用户交互活动中播放动画(着色器动画)。在动画之后,这些渲染处于“静态”状态(由着色器组合的“静态”图像),不需要在着色器中一次又一次地进行组合(是的,它会渲染,这里的“UIes”是指“着色器多纹理,或程序组合”)。如果不能停止这些无意义的渲染,它将消耗很大比例的GPU性能。
问题:
正如我们所知道的,当着色器材质的任何输入值发生更改时,无论"needupdate“是否为"false”,webGLRender都将更新输出材质。
但是,如果制服的输入值没有更改,webGLRender是否会再次渲染它,或者只是放弃渲染?这是问题1。
我读过"webGLRender.js“代码,理解不好,仍然不太确定着色器材质是如何渲染的。(从代码中,我相信它会继续渲染,但不是很确定)。
问题2:如果webGLRender继续渲染着色器材质,即使输入值没有更改,是否有方法可以停止webGLRender渲染“未更改”的着色器材质,以节省GPU性能?
下面是我的简单测试:
fragmentShader:
uniform float col;
void main() {
gl_FragColor = vec4(col, 0.58, 0.06, 1.0);
} vertexShader:
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position.x+5.0, position.y, position.z+25.0, 1.0);
}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);
}谢谢。
发布于 2017-10-15 09:00:58
https://stackoverflow.com/questions/46747194
复制相似问题