多个纹理OpenGL GLUT C ++

| 好的,仍然有一些问题,这就是我到目前为止的问题:
Bitmap Display::m_HeightMap;
unsigned int Display:: textures;
我的初始化方法:
 glEnable(GL_TEXTURE_2D);

Bitmap image[2];
GLuint *textures = new GLuint[2];
glGenTextures(1, textures);
glGenTextures(2, textures);
image[0].loadBMP(\"myTexture.bmp\");
image[1].loadBMP(\"myOtherTexture.bmp\");  

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data);
上一行给出了一个错误:.data的左侧必须具有class / struct / union
glDisable(GL_TEXTURE_2D);
绘制方法:
void Draw()
{
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS); //TOP
glBindTexture(GL_TEXTURE_2D, textures[0]);
glNormal3f(0,1,0);
glColor4f(1,1,1,0);
//glColor3d(0.5,0.40,0.05);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-4.5, 0.3, 2);//bottom left
glTexCoord2f(1.0f,0.0f);
glVertex3f(-4.5, 0.3, 2.5);//bottom right
glTexCoord2f(1.0f,1.0f);
glVertex3f(4.5, 0.3, 2.5);//top right
glTexCoord2f(0.0f,1.0f);
glVertex3f(4.5, 0.3, 2);//top left
glEnd();
glDisable(GL_TEXTURE_2D);
}
这里唯一的问题是纹理是不确定的。 希望最后一件事!
void loadTexture(GLuint texture, const char* filename)
{
   Bitmap image;

   Bitmap image[2];

   image[0].loadBMP(\"myTexture.bmp\");  <=== error 
   image[1].loadBMP(\"myTexture2.bmp\"); <=== error


   glBindTexture(GL_TEXTURE_2D, texture);

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_MODULATE);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, 
image.data); } 当我尝试加载多个位图时,出现7个错误, 错误C2040:图像:\'位图[2] \'在\'位图\'的间接访问级别上有所不同 错误C2088:\'[\'上课不合法(两次) 错误C2228:.BMP的左侧必须具有class / struct / union(两次) 没有运算符\“ [] \”匹配这些操作数(两次)     
已邀请:
所以。
glGenTextures
有两个参数。一个
int
和一个
GLuint*
int
告诉GL要生成多少个纹理,
GLuint*
GLuint
s的数组(生成纹理的位置)。您执行以下操作的原因...
GLuint m_TextureID
glGenTextures(1, &m_TextureID)
是因为您只有一种纹理。如果您有多个,则可以执行以下操作:
// Substitute \'n\' for some const number
GLuint *textures = new GLuint[n];
glGenTextures(n, textures);
这样,您告诉GL我想生成n个纹理,这是一个数组,至少为那么多纹理分配了空间。 假设您想在绘制循环中同时使用它们,则可以这样实现:
void draw()
{
   glBindTexture(GL_TEXTURE_2D, textures[0]); // Tell GL to use the first texture
   // Any drawing here will use first texture

   glBindTexture(GL_TEXTURE_2D, textures[1]); // Tell GL to use the second textures
   // Any drawing here will use second texture

   glBindTexture(GL_TEXTURE_2D, 0); // Set the GL texture to NULL, standard cleanup
}
分配该空间后,请确保在程序末尾显示“ 14”以正确清理。 还有一些方法不必绑定单独的纹理。您可以使用所谓的“纹理图集”。基本上,这是一个包含多个子图像的位图。因此,您只需生成并绑定一个位图,然后使用它的单独部分即可。 要处理多个位图,请执行以下操作:
Bitmap image[2];
image[0].loadBMP(\"myTexture.bmp\");
image[1].loadBMP(\"myOtherTexture.bmp\");
然后按照该过程为两个位图生成一个位图。 此行下方的所有内容均在回答您的更新问题。 这几乎可以完成您要执行的操作。
// Global variable
GLuint textures[2];

// init function
void init()
{
   textures = new GLuint[2]; 
   glGenTextures(2, textures);

   loadTexture(textures[0], \"texture1.bmp\");
   loadTexture(textures[1], \"texture2.bmp\");

}

void loadTexture(GLuint texture, const char* filename)
{
   Bitmap image; 
   image.loadBMP(filename); 

   glBindTexture(GL_TEXTURE_2D, texture);

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_MODULATE);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);

   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}

// draw function
void draw()
{
   glBegin(GL_QUADS); //TOP
   glBindTexture(GL_TEXTURE_2D, textures[0]);
   glNormal3f(0,1,0);
   glColor4f(1,1,1,0);
   glTexCoord2f(0.0f,0.0f); glVertex3f(-4.5, 0.3, 2); //bottom left
   glTexCoord2f(1.0f,0.0f); glVertex3f(-4.5, 0.3, 2.5); //bottom right
   glTexCoord2f(1.0f,1.0f); glVertex3f(4.5, 0.3, 2.5); //top right
   glTexCoord2f(0.0f,1.0f); glVertex3f(4.5, 0.3, 2); //top left
   glEnd();
}

// cleanup function
void cleanup()
{
   delete textures;
}
您指出的一些问题与OpenGL并不完全相关,它们与C / C ++密切相关。我知道这不是您要寻找的答案,但这可能会帮助您学习C函数,指针,数组等,并花费大量时间与函数/指针/数组紧密合作在继续学习像OpenGL之类的东西之前,需要对C有相当的了解。     
const GLsizei n =(此处的纹理数量); GLuint textureIDs = new GLuint [n]; glGenTextures(n,textureIDs);     
我假设您的意思是要生成多个纹理并将id存储在数组中?您可以这样做:
GLsizei num_textures = 5;
GLuint textures[num_textures];

glGenTextures(num_textures, textures);
完成此操作后,只需遍历纹理,然后为每个纹理进行绑定,设置参数,加载图像数据等。 您可能要在堆上创建纹理数组,以便以后可以访问纹理ID:
GLuint* textures = new GLuint[num_textures];
只需确保稍后删除该数组即可:
delete textures;
    

要回复问题请先登录注册