在用SOIL加载的纹理之间切换

时间:2013-04-17 15:14:10

标签: opengl textures soil

我正在尝试加载两个纹理,然后在我的显示功能中切换两个纹理。我正在使用SOIL库来加载纹理:

tex_2 = SOIL_load_OGL_texture
    (
            "s9.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

tex_1 = SOIL_load_OGL_texture
    (
            "s8.png",
            SOIL_LOAD_AUTO,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_MIPMAPS | SOIL_FLAG_COMPRESS_TO_DXT
    );

然后我用

glBindTexture(GL_TEXTURE_2D, tex_1) 
or
glBindTexture(GL_TEXTURE_2D, tex_2);

在两者之间切换。问题是我必须正确加载它们,我不知道如何。我最后加载的纹理(上面代码中的tex_1)是我尝试使用glBindTexture切换时tex_1和tex_2的纹理。有什么想法吗?

在加载茶纹之前,我设置了混合并打开纹理和精灵

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_POINT_SPRITE);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

然后在我的显示功能中,我遍历我想要绘制的所有点,并尝试在使用glVertex3f绘制点之前更改当前纹理:

for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

目标是我有两种类型的点,每个点上绘制的精灵取决于点所在的类

2 个答案:

答案 0 :(得分:3)

for(int i=0; i<num_particles; i++)
{
    //select texture to use
    if(class[i] == 2.0f)
        glBindTexture(GL_TEXTURE_2D, tex_2);
    else
        glBindTexture(GL_TEXTURE_2D, tex_1);

    glVertex3f(posn[3*i], posn[3*i+1], posn[3*i+2]);
}

您无法在glBegin()/glEnd()对中呼叫glBindTexture()

  如果在执行GL_INVALID_OPERATION和相应执行glBindTexture之间执行glBegin,则会生成

glEnd

最后成功 glBindTexture()可能是最近SOIL_load_OGL_texture()次来电。这就是tex_1tex_2似乎包含相同纹理数据的原因:tex_2永远不会反弹。

答案 1 :(得分:1)

如前所述:你不能在glBegin / glEnd之间改变纹理。

那你能做什么?