opengl - 在加载 SOIL 的纹理之间切换

标签 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 获得的纹理。有什么想法吗?

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

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]);
}

目标是我有两种类型的点,每个点要绘制的 Sprite 取决于该点所在的类

最佳答案

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]);
}

您无法调用 glBindTexture()glBegin()/glEnd() 对内:

GL_INVALID_OPERATION is generated if glBindTexture is executed between the execution of glBegin and the corresponding execution of glEnd.

最后一次成功 glBindTexture() 可能是在最近的 SOIL_load_OGL_texture() 调用中。这就是为什么 tex_1tex_2 似乎包含相同的纹理数据:tex_2 永远不会反弹。

关于opengl - 在加载 SOIL 的纹理之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16063830/

相关文章:

c# - 如何在 OpenTK 中裁剪圆形区域(小 map !)

c++ - OpenGL 缓冲区的状态如何在程序运行之间保持不变?

c++ - 在 OpenGL 中设置 VAO 的过程

ios - 优化 openGL ES 2.0 2D 纹理输出和帧率

c++ - Sprite 作为全局变量?

c++ - 在 OpenGL 中使用 SOIL 将纹理添加到三角形时出现问题

windows - OpenGL 1.1 函数的 wglGetProcAddress

java - 50 MB 图像使用 1 GB RAM 作为纹理

c++ - OpenGL SOIL 未定义对 glBindTexture、glTexImage2d 等的引用

c++ - SOIL_load_image() 返回 null