解決方法がわからない問題があります。 私は3D OpenGLとMVC++ 2010のゲームで複数のテクスチャを取得する方法を知っていますが、その方法は非常に遅いです。より多くのテクスチャをロードするほど、ゲームはより遅くなります。私がこのことに固執してから2週間が経ちました。私は多くのサイトを検索しましたが、どれも私を助けませんでした。glauxなしで複数のテクスチャを追加するにはどうすればよいですか?
私は間違いを与え続けているし、メモリリークがあると言われているので、膠色が欲しくない。 これは私が.RAWテクスチャをロードする方法です:
GLuint texture; //ID to bind with
GLuint LoadTexture(const char *filename, int imW, int imH){
unsigned char*data;
FILE*file;
file=fopen(filename,"rb");
if(file==NULL)return 0;
data=(unsigned char*)malloc(imW*imH*3);
fread(data,imW*imH*3,1,file);
fclose(file);
glGenTextures(1,&texture);
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_LINEAR);
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);
glTexParameterf(GL_TEXTURE_2D,0x8191,1); //0x8191 means GL_GENERATE_MIPMAP
glTexImage2D(GL_TEXTURE_2D,0,3,imW,imH,0,GL_RGB,GL_UNSIGNED_BYTE,data);
free(data);
return texture;
}
私はOpenGLの2を持っていますが、私が使用し、 "glTexParameterf(GL_TEXTURE_2D、0x8191,1);" "gluBuild2DMipmaps"がそれより遅いのでミップマップを構築する。
void model_room(float x, float y, float x2, float y2, float z, float z2){
LoadTexture("tex_floor.raw",512,512);
model_floor(x,y,x2,y2,z,7,7);
glDeleteTextures(1,&texture);
LoadTexture("tex_ceiling.raw",512,512);
model_floor(x,y,x2,y2,z2,4,4);
glDeleteTextures(1,&texture);
LoadTexture("tex_wall.raw",512,512);
model_wall(x,y,x,y2,z,z2,1,1);
glDeleteTextures(1,&texture);
LoadTexture("tex_tiles.raw",512,512);
model_wall(x,y2,x2,y2,z,z2,1,1);
glDeleteTextures(1,&texture);
LoadTexture("tex_diamondtiles.raw",512,512);
model_wall(x2,y2,x2,y,z,z2,1,1);
glDeleteTextures(1,&texture);
LoadTexture("tex_castlepoint.raw",512,512);
model_wall(x2,y,x,y,z,z2,5,3);
glDeleteTextures(1,&texture);
}
ここで、コードはテクスチャを読み込み、フレームごとに削除します。それはいい考えではないかもしれませんが、今は大丈夫です。 「model_wall」と「model_floor」については、これはコードです:
void model_floor(float x, float y, float x2, float y2, float z, float tc1, float tc2){
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(x, y, z);
glTexCoord2f(tc1, 0); glVertex3f(x, y2, z);
glTexCoord2f(tc1, tc2); glVertex3f(x2, y2, z);
glTexCoord2f(0, tc2); glVertex3f(x2, y, z);
glEnd();
}
void model_wall(float x, float y, float x2, float y2, float z1, float z2, float tch, float tcv){
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(x, y, z2);
glTexCoord2f(tch, 0); glVertex3f(x2, y2, z2);
glTexCoord2f(tch, tcv); glVertex3f(x2, y2, z1);
glTexCoord2f(0, tcv); glVertex3f(x, y, z1);
glEnd();
}
私はちょうど良い方法は、ゲームを落とすことなく、テクスチャをロードするだけで推奨されRawファイル以外のものをロードするために、それは重要ではありません。私はWin Baseのプログラマーではないので、これらのタイプのコードについていくつかの説明が必要な場合があります。どんな助けもありがとう。前もって感謝します!
ここで新しくなったので、同意と投票の機能についてご説明ください。 –