1

当没有给出纹理时,我一直在尝试为我的材质加载默认纹理。由于我使用的纹理加载器存在一些问题,我决定手动填充图像数据数组,然后将其传递给要绑定的 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 之前被初始化?

4

0 回答 0