Opengl 当我使用SOIL加载下一个图像时,它将替换之前加载的所有图像
这是我代码的一部分,一个简单的气球点击游戏。我有一个背景图像和另一个气球图像,代码似乎取代了我以前加载的所有图像。帮助PPPPOpengl 当我使用SOIL加载下一个图像时,它将替换之前加载的所有图像,opengl,Opengl,这是我代码的一部分,一个简单的气球点击游戏。我有一个背景图像和另一个气球图像,代码似乎取代了我以前加载的所有图像。帮助PPPP GLuint tex_2d; GLuint tex_bg; int main (int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE); glutInitWindowSize
GLuint tex_2d;
GLuint tex_bg;
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE);
glutInitWindowSize(800, 800);
glutInitWindowPosition(100, 100);
glutCreateWindow("Lab Assignment");
init();
glutDisplayFunc(display);
glutIdleFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return EXIT_SUCCESS;
}
这是我放置图像加载编码的地方,tex_bg是background.bmp,tex_2d是气球图像。为tex_2d加载的图像替换了加载较早的背景图像
void init()
{
tex_bg = SOIL_load_OGL_texture
(
"background.bmp",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
tex_2d = SOIL_load_OGL_texture
(
"balloonImage.bmp",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
if (tex_2d == 0 || tex_bg == 0)
{
printf( "SOIL loading error: '%s'\n", SOIL_last_result() );
exit(0);
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}
void drawQuadOutline()
{
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D, tex_bg);
glNormal3f(0, 1, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
drawQuadOutline();
drawCircleOutline(balloon[balloonBurst]);
glutSwapBuffers();
}
void drawCircleOutline(Circle o)
{
float angle;
glEnable(GL_TEXTURE_2D);
glBegin(GL_POLYGON);
glBindTexture(GL_TEXTURE_2D, tex_2d);
for(angle=0.0f; angle<360.0f; angle+=2.0f)
{
float radian = angle * (pi/180.0f);
float xcos = (float)cos(radian);
float ysin = (float)sin(radian);
float x = xcos * o.r + o.pos.x;
float y = ysin * o.r + o.pos.y;
float tx = xcos * 0.5f + 0.5f;
float ty = ysin * 0.5f + 0.5f;
glTexCoord2f(tx, ty);
glVertex2f(x, y);
}
glEnd();
glDisable(GL_TEXTURE_2D);
}
void init()
{
tex\u bg=土壤荷载\u OGL\u纹理
(
“background.bmp”,
土壤负荷自动控制,
土壤\u创建\u新的\u ID,
土壤标志MIPMAPS土壤标志倒置土壤标志NTSC安全RGB土壤标志压缩至DXT
);
tex_2d=土壤荷载纹理
(
“ballodyImage.bmp”,
土壤负荷自动控制,
土壤\u创建\u新的\u ID,
土壤标志MIPMAPS土壤标志倒置土壤标志NTSC安全RGB土壤标志压缩至DXT
);
if(tex_2d==0 | | tex_bg==0)
{
printf(“土壤加载错误:'%s'\n',土壤上次结果());
出口(0);
}
glTexParameteri(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性MIPMAP_线性);
}
void drawQuadOutline()
{
glEnable(GL_纹理_2D);
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D,tex_bg);
glNormal3f(0,1,0);
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);
格伦德();
glDisable(GL_纹理_2D);
}
无效显示()
{
glClear(GLU颜色缓冲位);
绘图轮廓();
drawCircleOutline(气球[气球爆破]);
glutSwapBuffers();
}
空图纸圆圈轮廓(圆圈o)
{
浮动角;
glEnable(GL_纹理_2D);
glBegin(GL_多边形);
glBindTexture(GL_TEXTURE_2D,tex_2D);
对于(angle=0.0f;angle编码的问题是在glBegin(…)
和glEnd(…)
之间调用glBindTexture(…)
这是无效的;如果您选中了glGetError(…)
,您就会知道这一点
您需要重新编写此代码:
为此:
glBegin(GL_POLYGON);
glBindTexture(GL_TEXTURE_2D, tex_2d);
...
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D, tex_bg);
glBindTexture(GL_TEXTURE_2D, tex_2d);
glBegin(GL_POLYGON);
...
glBindTexture(GL_TEXTURE_2D, tex_bg);
glBegin(GL_QUADS);