当它不是最后一个加载时,纹理会显得模糊
Textures appear blur when it's not the last one loaded
我正在尝试加载多个纹理(我的世界纹理)并将它们应用于立方体。我用 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,但是当我绘制立方体时,只有最后加载的纹理正确显示。另一个看起来有点模糊。
这里的结果:
左边的块是最后加载的纹理,右边的块是加载的第一个纹理。它以这种方式发生在任意数量的纹理上,最后一个总是正确的。
我尝试使用 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
设置当前绑定到指定目标的纹理对象的参数。
您必须为每个纹理对象设置纹理参数。
注意,GL_TEXTURE_MIN_FILTER
的初始值为GL_NEAREST_MIPMAP_LINEAR
,GL_TEXTURE_MAG_FILTER
的初始值为GL_LINEAR
。
对于图像(在问题中),纹理被放大了。这会导致对象的外观模糊,纹理参数不变。
我正在尝试加载多个纹理(我的世界纹理)并将它们应用于立方体。我用 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,但是当我绘制立方体时,只有最后加载的纹理正确显示。另一个看起来有点模糊。
这里的结果:
左边的块是最后加载的纹理,右边的块是加载的第一个纹理。它以这种方式发生在任意数量的纹理上,最后一个总是正确的。
我尝试使用 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
设置当前绑定到指定目标的纹理对象的参数。
您必须为每个纹理对象设置纹理参数。
注意,GL_TEXTURE_MIN_FILTER
的初始值为GL_NEAREST_MIPMAP_LINEAR
,GL_TEXTURE_MAG_FILTER
的初始值为GL_LINEAR
。
对于图像(在问题中),纹理被放大了。这会导致对象的外观模糊,纹理参数不变。