【问题标题】:different texture on each GLKit cube face每个 GLKit 立方体面上都有不同的纹理
【发布时间】:2012-11-01 11:36:33
【问题描述】:

我正在使用 GL Kit 绘制一个在屏幕上旋转的立方体。在每张脸上绘制相同的纹理时,我的效果非常好。我想在每张脸上画出不同的纹理。

这是当前我的代码绘制立方体的方式(请注意,我实际上在 theTextures 数组中加载了 6 个不同的纹理,但到目前为止,当我更改纹理时,我只绘制相同的立方体的所有边)。

self.effect.texture2d0.name = theTextures[i].name;
self.effect.texture2d0.enabled = true;
self.effect.texture2d0.target = GLKTextureTarget2D;

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

glBindVertexArrayOES(_vertexArray); 

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

我在 stackOverflow 上做了很多搜索并查看了很多教程,但找不到一个简单的方法来做到这一点。我假设我可以为每个边创建一个顶点数组并为每个顶点数组使用 glDrawElements,但这似乎非常低效。有没有办法让我不必创建 6 个不同的顶点数组来做到这一点?谢谢!

【问题讨论】:

    标签: ios textures glkit


    【解决方案1】:

    一个相当常见的方法是使用纹理贴图。也就是说,一个纹理包含您需要的所有子纹理。通过这种方式,您不会因大量纹理而使系统过载,但您仍然可以获得所需的所有图形。例如,如果这里只有 4 个纹理,您的图像可能如下所示:

    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
    

    (注意:如果纹理的边是 2 的幂(2、4、8、16、32...),则效果最好,尽管它不需要是正方形的!)

    然后,当你想使用纹理的一部分时,只需选择正确的 tx.s/tx.t 坐标即可在该面上获得你想要的图像部分。

    【讨论】:

      【解决方案2】:

      我发现以一种有些有效的方式来做这件事,尽管我仍然分别画出每一边。我为每一边创建了一个不同的顶点数组和纹理,但只使用一个索引数组,其中顶点在两个三角形中描述。如果您有任何建议,请通过我的方式发送,

      // draw one texture per side
      
      for (int i = 0; i <= 5; i++)
      {
          glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[i]);
          glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
      
          glEnableVertexAttribArray(GLKVertexAttribPosition);
          glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
          glEnableVertexAttribArray(GLKVertexAttribColor);
          glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
          glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
          glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));
      
          glActiveTexture(GL_TEXTURE0);
          glBindTexture(GL_TEXTURE_2D, myTexture[i].name);
      
          glDrawElements(GL_TRIANGLES, sizeof(Indices1)/sizeof(Indices1[0]), GL_UNSIGNED_BYTE, 0);
      }
      

      【讨论】:

      • 你能发布你的完整源代码吗?我正在尝试做同样的事情。
      • Nix 最后的评论。我最终选择了下面的纹理贴图解决方案。它最终变得容易得多。
      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 2012-08-11
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 2014-08-31
      相关资源
      最近更新 更多