多个纹理OpenGL GLUT C++

Tig*_*nce 8 c++ opengl textures

好吧,还有一些问题,这是我到目前为止:

Bitmap Display::m_HeightMap;
unsigned int Display:: textures;
Run Code Online (Sandbox Code Playgroud)

我的初始化方法:

 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);
Run Code Online (Sandbox Code Playgroud)

上面的行给出了一个错误:.data的左边必须有class/struct/union

glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

绘制方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是纹理是未定义的.

希望最后一件事!

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, 
Run Code Online (Sandbox Code Playgroud)

image.data); }

当我尝试加载多个位图时,我得到7个错误,

错误C2040:图像:'Bitmap [2]'在'Bitmap'
错误的间接级别上有错误C2088:'''对于类非法(两次)
错误C2228:.BMP的左边必须有class/struct/union(两次)
no运算符"[]"匹配这些操作数(两次)

And*_*sen 17

所以.glGenTextures有两个参数.一个int,和一个GLuint*.的int讲述GL多少纹理生成,并且GLuint*是阵列GLuints(其中,以生成纹理).你做以下的原因......

GLuint m_TextureID
glGenTextures(1, &m_TextureID)
Run Code Online (Sandbox Code Playgroud)

是因为你只有一个纹理.如果你有多个,你会这样做:

// Substitute 'n' for some const number
GLuint *textures = new GLuint[n];
glGenTextures(n, textures);
Run Code Online (Sandbox Code Playgroud)

这样,你告诉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
}
Run Code Online (Sandbox Code Playgroud)

确保delete textures;在程序结束后分配该空间后正确清理.

还有一些方法可以不必绑定单独的纹理.你可以使用所谓的"纹理图集".基本上,这是一个包含多个子图像的位图.因此,您只需生成并绑定一个位图,并使用它的单独部分.

要处理多个位图,请执行以下操作:

Bitmap image[2];
image[0].loadBMP("myTexture.bmp");
image[1].loadBMP("myOtherTexture.bmp");
Run Code Online (Sandbox Code Playgroud)

然后按照该过程为两个位图生成一个位图.


此行下方的所有内容都会回复您更新的问题.

这应该是你要做的事情.

// 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;
}
Run Code Online (Sandbox Code Playgroud)

您指出的一些问题并不完全与OpenGL相关,它们与C/C++有关.我知道这不是您正在寻找的答案,但它可能会帮助您了解C函数,指针,数组等,并花费一个月的时间与函数/指针/数组紧密合作像OpenGL这样的东西需要对C语有一个相当温和的理解.