目前我正在构建一个简单的 3D 渲染器。渲染器从 Wavefront OBJ 文件中读取对象信息。我从文件中得到的是顶点坐标、法线坐标和 UV 坐标。OBJ 文件附带一个 MTL 文件,其中包含有关材料的信息。我现在正在做的是使用 glGenBuffers 生成缓冲区:
- 顶点缓冲区
- 正常缓冲区
- UV 坐标缓冲区
- 漫反射颜色缓冲器
- 高光颜色缓冲区
- 环境色彩缓冲器
- 透明缓冲区
这些缓冲区或数组是有序的,因此每个顶点都有其正确的法线、uv 坐标等。
据我了解,这就是 glMultiDrawArrays 希望排列数据的方式,并且可以正常工作。所以我的场景被渲染并且对象具有正确的材质颜色但还没有纹理。我应该补充一点,我正在使用我在教程中找到的顶点着色器和片段着色器,它们可以正常工作。碎片着色器进行颜色计算。
现在我想为我的对象添加纹理(顶点已经具有正确的 uv 坐标,如上所述)。我的第一个想法是首先渲染所有没有纹理的对象,以从 glMultiDrawArrays 获得速度优势,然后再渲染每个具有纹理的对象。
但后来我看到片段着色器正在使用 UV 坐标对颜色的纹理进行采样。我的想法是自己以某种方式使用 UV 坐标对纹理进行采样,并将颜色写入我的颜色缓冲区(使用具有 UV 坐标的顶点的纹理颜色覆盖顶点颜色),通过这样做,我可以渲染整个场景一口气。
我对这个话题很陌生,所以我的问题是:
我可以以某种方式使用片段着色器外部的纹理采样器来获取颜色信息吗?
和
我的第二个问题是,如果这首先是完全错误的方法,并且有一种我还不知道的标准方法吗?
如果有人能指出我正确的方向,我将不胜感激。谢谢