好的还是有一些问题,这是我到目前为止:
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(两次)
没有运算符“[]”匹配这些操作数(两次)
答案 0 :(得分:16)
因此。 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
}
确保在程序结束时delete textures;
在分配该空间后正确清理。
还有一些方法可以不必绑定单独的纹理。你可以使用所谓的“纹理图集”。基本上,这是一个包含多个子图像的位图。所以你只需生成并绑定一个位图,并使用它的不同部分。
要处理多个位图,请执行以下操作:
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语言有一个非常温和的理解。
答案 1 :(得分:0)
const GLsizei n =(这里的纹理数量);
GLuint textureIDs = new GLuint [n];
glGenTextures(n,textureIDs);
答案 2 :(得分:0)
我假设您想要生成多个纹理并将ID存储在数组中?你可以这样做:
GLsizei num_textures = 5;
GLuint textures[num_textures];
glGenTextures(num_textures, textures);
完成后,只需遍历纹理并为每个纹理进行循环,绑定,设置参数,加载图像数据等。
您可能希望在堆上创建纹理数组,以便稍后可以访问纹理ID:
GLuint* textures = new GLuint[num_textures];
请确保稍后删除该数组:
delete textures;