它看起来不像任何操作可以使底部行其他[0 0 0 1]
和顶点位置来与vec3需要升级到vec4之前变换。然而,我经常看到使用mat4进行投影/视图/ modeltoworld的着色器。考虑到,为什么标准使用mat4而不是mat3x4?我们可以保存16个字节和一个mat4xvec4乘法的1/4的传输。为什么大多数着色器使用mat4而不是mat3x4?
1
A
回答
3
例如,透视投影变换具有底部行[0 0 -1 0]
,其影响顶点的坐标。因此,如果您使用vec3
来表示着色器中的顶点,那么在应用mat3x4
转换之后,OpenGL(以及几乎所有其他呈现API)将自动为坐标值插入1.0值,这将有效地禁用透视分割步骤(即,当图形系统将每个X,ÿ,和ž通过坐标瓦特),其是允许对象似乎更小,因为它们从眼睛得到更远的魔法。
一般而言,每次统一更新(这是您要做的更新投影转换矩阵,并且每个着色器程序绑定可能会发生一次)保存16个字节与优化顶点属性或纹理上传几乎任何其他图形相关。
+0
是的,我没有'想推动性能方面更多的逻辑方面。是的,你是对的,虽然我刚刚在我使用的图书馆中找到了光明的一面 – user2475269
相关问题
- 1. 为什么不使用数组而不是许多参数
- 2. 为什么CG着色器不能使用GL 3.2?
- 3. Object.prototype.toString.call(),为什么在大多数示例中使用call()而不是应用?
- 4. 使用多个着色器
- 5. 为什么赛格控制着色器被调用多次?
- 6. 什么是立体着色器?
- 7. 为什么OpenGL着色器函数不能被定义?
- 8. 什么是顶点着色?
- 9. 多个着色器或一个大着色器?
- 10. 为什么不着色图像工作?
- 11. 为使用数组着色的着色器设置动画
- 12. 为什么使用数据而不是xdata显着减少代码空间
- 13. 为什么我会使用白色屏幕而不是地图?
- 14. glDrawElements不使用着色器?
- 15. three.js /从着色器读取mat4类型的THREE.InstancedBufferAttribute
- 16. 为什么使用classmethod而不是staticmethod?
- 17. 为什么使用iconv_strpos而不是strpos?
- 18. 为什么使用registerDefaults:而不是setValue:forKey:?
- 19. 为什么使用TagBuilder而不是StringBuilder?
- 20. 为什么,而不是使用回调
- 21. 为什么使用结构,而不是
- 22. 为什么使用StringWriter而不是StringBuffer?
- 23. 为什么使用s:Line而不是mx:HRule?
- 24. 为什么使用ImageIcon而不是Image?
- 25. 为什么使用SQLiteOpenHelper而不是SQLiteDatabase?
- 26. 为什么使用MapFragment而不是SupportMapFragment?
- 27. 为什么使用FloatBuffer而不是float []?
- 28. 为什么使用追加()而不是+
- 29. 为什么使用Number.parseInt而不是parseInt()?
- 30. 为什么使用JLE而不是JL?
你在说什么仍然需要一个vec4(你需要W = 1),并且所讨论的矩阵需要是mat4x3(4列,3行)。否则,位置翻译不起作用。 –