当没有给出纹理时,我一直在尝试为我的材质加载默认纹理。由于我使用的纹理加载器存在一些问题,我决定手动填充图像数据数组,然后将其传递给要绑定的 OpenGL 函数。不幸的是,这导致我的模型是黑色的,这意味着纹理没有正确加载。
下面显示了两个不同的构造函数。第一个从文件加载纹理(并且可以工作),而第二个用 255 个字符(应该是白色的)填充 char 缓冲区。InitTexture() 函数执行所有 OpenGL 函数来绑定纹理,并且适用于加载的纹理,但不适用于我的手动缓冲区。
我已经检查以确保数据正确,甚至将其与加载的纹理进行比较,该纹理只是一张白色图像并且值相同。
构造函数被设计用于初始化静态变量。不确定这是否会影响任何 OpenGL 功能。
// Texture loaded Constructor - Works Fine
Texture::Texture(const std::string& filename)
{
// Load texture from file
int width, height, numComponents;
unsigned char* imageData = stbi_load(filename.c_str(), &width, &height, &numComponents, 4);
if (imageData == NULL)
std::cerr << "Error: Texture loading failed: " << filename << std::endl;
InitTexture(imageData, width, height);
stbi_image_free(imageData);
}
// Manual Texture Constructor - should be white but isn't
// A 4x4 image should have 16 pixels and each pixel has 4 values (RGBA)
// meaning 64 should be the correct size for the buffer??
Texture::Texture()
{
int height = 4;
int width = 4;
unsigned char* data = new unsigned char[64];
for (int i = 0; i < 64; ++i)
data[i] = 255;
InitTexture(data, width, height);
delete[] data;
}
// This is the initialization of the DefaultDiffuse texture - this is the
// static varible in the Material class
Texture Material::defaultDiffuse = Texture();
我设法做的唯一解决方法是为漫反射纹理设置一个静态 Setter,并将加载的纯白色纹理的副本传递给它。
如果我可以提供更多信息,请告诉我。谢谢
编辑:
这是 InitTexture() 函数。它是处理绑定和生成纹理的所有 OpenGL 操作的函数。
void Texture::InitTexture(unsigned char* data, const int& width, const int& height, bool mipmap)
{
// Create handle to texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// Sets texture wrap mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Handles sampling the texture
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// Generates the texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
}
编辑2:
在做了一些测试之后,我发现如果不是在构造函数中调用 InitTexture(),而是在我必须在 main 方法的开头调用的静态函数中调用它,并且由于某种原因,它可以工作。我的猜测是,当初始化静态成员变量时调用 OpenGL 函数时,缓冲区没有正确设置。不幸的是,我对 OpenGL 的了解还不够,无法知道它的元素何时被初始化。静态变量是否有可能在 OpenGL 之前被初始化?