gpt4 book ai didi

c++ - Opengl C++ : texture code textures all models with the same texture

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:03 24 4
gpt4 key购买 nike

我创建了一个类来保存我的模型信息。我必须正确渲染模型并正确包裹纹理,但出于某种原因,如果我有多个模型,它会将我的所有模型纹理化为仅 1 个纹理,如您在此图像中所见:http://imgur.com/d0glIwF

知道为什么会发生这种情况吗?

这是我的代码:

struct BitMapFile
{
int sizeX;
int sizeY;
unsigned char *data;
};


// Routine to read a bitmap file.
// Works only for uncompressed bmp files of 24-bit color.
BitMapFile *getBMPData(string filename)
{
BitMapFile *bmp = new BitMapFile;
unsigned int size, offset, headerSize;

// Read input file name.
ifstream infile(filename.c_str(), ios::binary);

// Get the starting point of the image data.
infile.seekg(10);
infile.read((char *) &offset, 4);

// Get the header size of the bitmap.
infile.read((char *) &headerSize,4);

// Get width and height values in the bitmap header.
infile.seekg(18);
infile.read( (char *) &bmp->sizeX, 4);
infile.read( (char *) &bmp->sizeY, 4);

// Allocate buffer for the image.
size = bmp->sizeX * bmp->sizeY * 24;
bmp->data = new unsigned char[size];

// Read bitmap data.
infile.seekg(offset);
infile.read((char *) bmp->data , size);

// Reverse color from bgr to rgb.
int temp;
for (int i = 0; i < size; i += 3)
{
temp = bmp->data[i];
bmp->data[i] = bmp->data[i+2];
bmp->data[i+2] = temp;
}

return bmp;
}

class Model
{
public:
Model(string modelFilename, string textureFilename);

float getCenterX() { return m_CenterX; }
float getCenterY() { return m_CenterY; }
float getCenterZ() { return m_CenterZ; }
void SetCenterX(float x) { m_CenterX = x; }
void SetCenterY(float y) { m_CenterY = y; }
void SetCenterZ(float z) { m_CenterZ = z; }

void LoadTexture(string fileName);
//load model function
void Draw();
private:

float m_CenterX, m_CenterY, m_CenterZ, m_Width, m_Height, m_Depth;

string m_ModelFilename;

int m_Texture;
string m_TextureName;
};
Model::Model(string modelFilename, string textureFilename)
{
m_ModelFilename = modelFilename;
m_TextureName = textureFilename;

//load model function//
LoadTexture(m_TextureName);
}

void Model::LoadTexture(string TextureName)
{
// Local storage for bmp image data.
BitMapFile *image[1];

string filename = TextureName;
filename.append(".bmp");

// Load the texture.
image[0] = getBMPData(filename);

// Bind grass image to texture index[i].
glBindTexture(GL_TEXTURE_2D, m_Texture); //makes room for our texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, //always GL_TEXTURE_2D
0, //0 for now
GL_RGB, //format opengl uses to read textures
image[0]->sizeX, //width
image[0]->sizeY, //height
0, //the border of the image
GL_RGB, //GL_RGB because pixels are stored in RGB format
GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE because pixels are stored as unsigned numbers
image[0]->data); //actual pixel data
}

void Model::Draw()
{
glPushMatrix();
glTranslatef(m_CenterX, m_CenterY, m_CenterZ);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Texture);

glBegin(GL_TRIANGLES);
//my code for drawing the model to the screen. it isn't the problem so i removed it
glEnd();

glDisable(GL_TEXTURE_2D);
glPopMatrix();
}

Model model;
Model model1;

// Drawing routine.
void drawScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

model.SetCenterX(0);
model.SetCenterY(0);
model.SetCenterZ(12);
model.Draw();

model1.SetCenterX(12);
model1.SetCenterY(10);
model1.SetCenterZ(0);
model1.Draw();

glutSwapBuffers();
}

void setup(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);

//model = Model("monkey.obj", "launch");
model = Model("cube.obj", "launch");

model1 = Model("cube.obj", "grass");

// Specify how texture values combine with current surface color values.
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
}

提前谢谢你。

最佳答案

问题是您没有创建纹理 ID。您可以使用 glGenTextures 函数来做到这一点。在你的情况下,我会把它放在 LoadTexture 方法的开头 - 只需向它询问 1 个纹理 ID 并将它给你的内容保存回 m_Texture

请记住,就像您使用 glGen* 创建的所有内容一样,当您使用 glDelete* (glDeleteTextures在这种情况下)。

此外,请考虑使用着色器和顶点数组迁移到更现代的 OpenGL。不幸的是,这是一个非常广泛的话题。有很多可用的教程和书籍,我从OpenGL Superbible学习的, 虽然听说有些人不太喜欢...

关于c++ - Opengl C++ : texture code textures all models with the same texture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com