使用多个VBO将纹理放置在屏幕上的不同点

时间:2014-10-24 10:27:49

标签: android c++ opengl-es game-engine

我目前正在使用opengl ES为Android平台开发游戏。我的问题涉及使用2个vbos,每个vbos在屏幕上的不同点放置一个单独的纹理,并将其映射到相应的纹理坐标。

x,y for screen coordinates followed by the x,y for texture coordinates

{-1.0f, -1.0f, 0.0f, 0.0f,
- 1.0f,  1.0f, 0.0f, -1.0f,
  1.0f, -1.0f, 0.5f, 0.0f,
  1.0f,  1.0f, 0.5f, -1.0f};

{-0.75f, -0.75f, 0.0f, 0.0f,
 -0.75f, 0.0f, 0.0f, -1.0f,
 -0.25f, -0.75f, 1.0f, 0.0f,
 -0.25f, 0.0f, 1.0f, -1.0f};

所以基本上第一个VBO代表占据整个屏幕的第一个纹理,只显示其中的一半。类似地,第二个VBO表示第二个纹理仅占据屏幕的一部分但显示完整的纹理。

现在我的问题是,如何仅使用一个glDraw调用和单个顶点和片段着色器在屏幕上渲染这两个纹理(我的片段着色器负责混合2个纹理,它们相交的部分)?如果那是不可能的,那么实现同样目标的最有效方法是什么?

(目前我的顶点着色器将gl_Position设置为仅由第一个VBO指定的第一个位置,因此两个纹理都是使用第一个VBO绘制的。)

如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

这应该很容易。如果您已经设法在片段着色器中同时使用2个纹理,那么您需要创建另一个存储第二个纹理坐标的属性。然后你做的是设置2个指针并在绘制之前将它们分别绑定到属性,并在片段着色器中使用第二个纹理的第二个属性。

这完全与VBO无关。您甚至可以使用包含两个纹理坐标的单个VBO,并将第二个指针设置为指向缓冲区第二部分开头的偏移量。要继续了解如何在您的情况下正确使用VBO,您需要交错缓冲区中的坐标,以便单个顶点的结构为:

{
   position.x, position.y, position.z,
   texCoord1.x, texCoord1.y
   texCoord2.x, texCoord2.y
}

然后根据需要设置它们,但在设置属性指针时使用偏移和步幅来获得正确的结果。由于数据访问速度更快,维护此过程应该可以提高性能。