c++ - 当不是最后加载的纹理时,纹理会显得模糊

标签 c++ opengl textures soil

我正在尝试加载多个纹理(我的世界纹理)并将它们应用到立方体。我用 SOIL 加载纹理:


GLuint loadTex(const char * path)
{
    GLuint image = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
    (
        path,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | 
        SOIL_FLAG_INVERT_Y | 
        SOIL_FLAG_TEXTURE_REPEATS | 
        //SOIL_FLAG_MULTIPLY_ALPHA |
        SOIL_FLAG_NTSC_SAFE_RGB | 
        SOIL_FLAG_COMPRESS_TO_DXT
    );

    if (!image)
    {
        printf("SOIL loading error: '%s'\n", SOIL_last_result());
    }

    std::cout << "texId: " << image << std::endl;
    return image;
}

我正在通过加载 2 个不同的纹理(它们有不同的 ID)来测试它。 我将这些纹理传递给一个函数,该函数创建具有给定纹理 id 的立方体:

GLuint createTexturedCube(GLuint texId)
{
    GLuint index = glGenLists(1);
    glNewList(index, GL_COMPILE);
        glPushMatrix();
        glEnable(GL_TEXTURE_2D);

        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glBindTexture(GL_TEXTURE_2D, texId);

        glBegin(GL_QUADS);

        glNormal3f(0, 1, 0);
        glTexCoord2f(1, 1); glVertex3f(0.5f, 0.5f, -0.5f);
                ...
}

我正在加载两个纹理并创建两个立方体。 SOIL 的输出显示它们是 id 1 和 2,但是当我绘制立方体时,只有最后加载的纹理显示正确。另一张看起来有点模糊。

结果在这里:

左边的 block 是最后加载的纹理,右边的 block 是第一个加载的纹理。对于任何数量的纹理都会发生这种情况,最后一个总是正确的。

我尝试使用 glActiveTexture 但这会引发异常(尝试访问 #0000000 时出现段错误)

我的纹理设置如下:

        glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.1);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_NEAREST);

最佳答案

glTexParameteri不会更改全局设置(或采样器对象的设置)。
glTexParameter 设置当前绑定(bind)到指定目标的纹理对象的参数。
您必须为每个纹理对象设置纹理参数。

请注意,GL_TEXTURE_MIN_FILTER 的初始值为 GL_NEAREST_MIPMAP_LINEARGL_TEXTURE_MAG_FILTER 的初始值为 GL_LINEAR。< br/> 对于图像(在问题中),纹理被放大。这会导致对象看起来模糊,且纹理参数不变。

关于c++ - 当不是最后加载的纹理时,纹理会显得模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56135104/

相关文章:

c++ - 如何为QMessageBox中的特定标签设置StyleSheet?

c++ - OpenCV imwrite保存完整的黑色jpeg

OpenGL:将着色器附加到处于有效链接状态的程序是否合法?

c++ - glBindMultiTexture 和 glEnableIndexed 的语义?

javascript - 三个js : What is the probable cause of this texture tearing?

c++ - 为每个物体绑定(bind)不同的纹理

java - libgdx 纹理过滤器和 mipmap

c++ - 使用单个命令进行结构初始化(零值)

c++ - 如何声明一个推导出返回类型的函数?

c++ - OpenGL 不绘制三角形