我正在使用Three.js构建一个场景,在该场景中,我希望将最大数量的四边形打包到每个绘制调用中。在我的机器上,限制因素是我在每个绘制调用中可以显示的纹理数量。
让我感到困惑的是,import 'package:flutter/material.dart';
main() => runApp(MaterialApp(
home: Scaffold(
bottomNavigationBar: BottomAppBar(
shape: CircularNotchedRectangle(),
child: Container(
height: 300.0,
color: Colors.pinkAccent,
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: FloatingActionButton(onPressed: () {}),
),
));
返回16,但是如果我尝试将16个纹理恰好传递到gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)
中,则会出现以下错误:
THREE.WebGLProgram:着色器错误:0 gl.VALIDATE_STATUS否 gl.getProgramInfoLog错误:16个活动片段的实现限制 着色器采样器(例如,支持的最大图像单元数) 超过了,片段着色器使用了17个采样器
如果我恰好传递了15个纹理,则场景渲染良好(尽管当然缺少纹理)。
我的问题是:Three.js是否在某个地方的每个绘制调用中添加了额外的纹理?如果不是,有谁知道一个问题可能导致什么?他人在此问题上提供的任何帮助将不胜感激。
答案 0 :(得分:0)
我的问题是:Three.js是否在某个地方的每个绘制调用中添加了额外的纹理?如果不是,有谁知道一个问题可能导致什么?
是的,大多数材料注入了与各种地图相关的各种采样器。它可以像“反照率图”一样简单明了,但也可以是例如阴影图。如果您不希望三个人注入东西,请使用RawShaderMaterial
。
答案 1 :(得分:0)
好尴尬。事实证明,我正在将16个纹理传递给着色器,但是我试图访问texture2D(textures[16])
,正是这种尝试从采样器索引> max textures中读取引发了此错误。
有趣的是,传递比gl.MAX_TEXTURE_IMAGE_UNITS
长的材料数组不会引发错误-它试图访问索引值> gl.MAX_TEXTURE_IMAGE_UNITS
-1会引发错误。