Jac*_*rks 2 android opengl-es ios
我无法纹理每个面具有不同纹理的立方体.我可以在所有面上绘制一个带有一个纹理的立方体,但是当我尝试使用多个纹理时它会失败.我尝试这样做的方式是这样的:
//my indexing array located in a header file
#define NUM_IMAGE_OBJECT_INDEX 36
static const unsigned short cubeIndices[NUM_IMAGE_OBJECT_INDEX] =
{
0, 1, 2, 2, 3, 0, // front
4, 5, 6, 6, 7, 4, // right
8, 9,10, 10,11, 8, // top
12,13,14, 14,15,12, // left
16,17,18, 18,19,16, // bottom
20,21,22, 22,23,20 // back
};
Run Code Online (Sandbox Code Playgroud)
现在在我的渲染功能中,这当前适用于使用单个纹理绘制立方体
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, 0);
Run Code Online (Sandbox Code Playgroud)
这不起作用
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[0]);
Run Code Online (Sandbox Code Playgroud)
从其他一些例子来看,它应该等同于同一件事.最终我想这样做:
for(int i = 0; i < 6; i++){
iconTextureID = textureID[i];
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[i*6]); //index 0-5 use texture 1, 6-11 use texture 2, etc
}
Run Code Online (Sandbox Code Playgroud)
有谁知道这个索引可能有什么问题?香港专业教育学院基本上从一个Android项目(有效)复制粘贴此代码,目前正在尝试在ios上执行此操作.
在OpenGL ES 2.0中,索引数据可以来自缓冲区对象或指向客户端内存的指针.您的代码显然使用缓冲区对象.虽然您没有显示此缓冲区对象的创建,但是您上传指针的客户端数组,或者在glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)使用它进行渲染之前调用的位置.必须在那里,否则你的代码就会崩溃.当绑定缓冲区时GL_ELEMENT_ARRAY_BUFFER,OpenGL期望给glDrawElements的"指针" 是缓冲区对象的字节偏移量,而不是客户端内存指针.
这就是为什么复制和粘贴编码是一个坏主意.你复制的地方可能是使用客户端内存; 你不是.
如果希望循环代码有效,则需要自己进行指针运算:
for(int i = 0; i < 6; i++)
{
iconTextureID = textureID[i];
glBindTexture(GL_TEXTURE_2D, iconTextureID);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, reinterpret_cast<void*>(i * 6 * sizeof(GLushort)));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1923 次 |
| 最近记录: |