gpt4 book ai didi

c++ - OpenGL 加载将最后加载的纹理绑定(bind)到所有 textureID

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:10 24 4
gpt4 key购买 nike

所以我的问题是我尝试在启动时加载多个纹理,然后存储所有 ID,以便我可以绑定(bind)它们以使用它们。现在我知道 ID 已正确存储,因为我可以调试它并在分配和使用中看到 ID 是相同的。对于每个绑定(bind),它都使用我加载的最后一个纹理。这是我的代码:

GLuint TextureLoader::LoadTexture (const char* fileName,Material& material,int width,int height) {
GLuint textureImage;

FILE* textureFile;
textureFile = fopen(fileName, "rb");
unsigned char* imageData;

if (textureFile == NULL) {
return 0;
}
imageData = (unsigned char*)malloc(width * height * 3);
char header[54];
fread(header,1,54,textureFile);
fread(imageData, width * height * 3, 1, textureFile);

fclose(textureFile);

for (int i = 0; i < width * height; ++i) {
int nextIndex = i * 3;
unsigned char a = imageData[nextIndex];
unsigned char b = imageData[nextIndex+2];

imageData[nextIndex] = b;
imageData[nextIndex+2] = a;
}

glEnable(GL_TEXTURE_2D);
glGenTextures( 1, &textureImage );
glBindTexture( GL_TEXTURE_2D, textureImage );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE );
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_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


/*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 );
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, imageData );*/
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, imageData);
glGenerateMipmap(GL_TEXTURE_2D);
free(imageData);

return textureImage;
}

这是我对这段代码的用法:

if (showTexture) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.texture);
}

这是我的加载调用:

green1.texture = TextureLoader::LoadTexture("/Users/hewitt/Desktop/OpenGLImages/face6.bmp",green1, 256, 256);

然后我就用:

glTexCoord2f(1.0f,0.0f);

根据它变化的角来绘制。这正确地绘制了一个纹理,它只是重复纹理,即使我 glBind 一个不同的数字也是如此。

非常感谢任何帮助。

编辑------------

glBegin(mode);
Spatial::Vector3 normal = Mesh::calculateNormal (pointGroup);
glNormal3f(normal.x, normal.y, normal.z);

Material material = mesh.getMaterial();

if (showTexture) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.texture);
}

int counter = 0;
for (Spatial::Vector3 point : pointGroup) {
if (showTexture == false) {
Material::Colour colour = material.getColour();
glColor3f(colour.red, colour.green, colour.blue);
} else {

if (counter == 0) {
glTexCoord2f(1.0f,0.0f);
} else if (counter == 1) {
glTexCoord2f(1.0f,1.0f);
} else if (counter == 2) {
glTexCoord2f(0.0f,1.0f);
} else if (counter == 3) {
glTexCoord2f(0.0f,0.0f);
}
}

glVertex3f(point.x,point.y,point.z);
counter ++;
}


glEnd();

最佳答案

您不能在 glBeginglEnd 之间调用 glEnableglBindTexture。您必须在 glBegin 之前绑定(bind)您的纹理。事实上,您可以在 glBeginglEnd 之间调用的 OpenGL 函数集仅限于那些传输顶点属性(glVertexglColorglTexCoord 等...)。

请注意,立即模式 API(即 glBegin/glEnd 和 friend )是遗留的,已弃用 10 多年。我建议您切换到现代 OpenGL 管道,它会为您解决很多问题。

关于c++ - OpenGL 加载将最后加载的纹理绑定(bind)到所有 textureID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41117070/

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