그래서 제 문제는 시작시 여러 텍스처를로드하고 모든 ID를 저장하려고 시도하여 모든 ID를 바인딩하여 사용하도록하는 것입니다. 이제 ID를 정확하게 디버깅 할 수 있고 ID가 동일하다는 것을 할당 및 사용법에서 볼 수 있기 때문에 ID가 올바르게 저장되고 있음을 알았습니다. 바인딩 할 때마다 마지막으로로드 한 텍스처를 사용합니다. 여기 OpenGL 로딩은 마지막으로로드 된 텍스처를 모든 textureID에 바인딩합니다.
if (showTexture) {
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, material.texture);
}
내 부하 호출입니다 : 여기
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;
}
이 코드의 내 사용이다 :
green1.texture = TextureLoader::LoadTexture("/Users/hewitt/Desktop/OpenGLImages/face6.bmp",green1, 256, 256);
그리고 난 그냥 사용 : 여기 내 코드입니다
glTexCoord2f(1.0f,0.0f);
모서리에 따라 그릴 수 있습니다. 그리고 이것은 하나의 텍스처를 정확하게 그립니다. 다른 숫자를 바인딩 할 때에도 텍스처를 반복합니다.
도움을 주시면 대단히 감사하겠습니다.
편집 ----------
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