私の問題は、起動時に複数のテクスチャを読み込み、すべてのIDを保存してそれらを使用するようにバインドできるようにすることです。今私はそれをデバッグすることができ、割り当てと使用法の両方でIDが同じであることがわかるので、IDが正しく格納されていることを知っています。バインディングごとに、ロードする最後のテクスチャが使用されます。ここに私のコードは次のとおりです。ここでOpenGLを読み込むと、最後に読み込まれたテクスチャがすべてのtextureIDにバインドされます
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);
角を変えて描画する。そして、これは1つのテクスチャを正確に描画します。異なる数の文字をバインドしてもテクスチャが繰り返されます。
ご協力いただきまして誠にありがとうございます。 glBegin
とglEnd
の間にいる間
編集----------
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();
「私はちょうど使用する」とはどういう意味ですか?その機能自体は何もしません。実際に物を描く関連部分を表示する。私はあなたがレガシーの即時APIに悩まされていて、 'glBegin/glEnd'の中からテクスチャを再バインドしようとしたと思います。 – ybungalobill
@ybungalobill私は変更を加えました。 – Hewiiitt
'glGetError()'の結果を実際に調べるべきです。あなたの場合、 'glBegin/glEnd'の間に呼び出されることが許されている全ての関数に対して' GL_INVALID_OPERATION'を取得しています。 – BDL