【问题标题】:Create A Solid Color Texture In OpenGL在 OpenGL 中创建纯色纹理
【发布时间】:2020-11-27 09:40:09
【问题描述】:

我有一个关于在没有文件的情况下创建纹理的问题。我的目标是制作一个将 vec3 颜色作为输入并返回该纹理的纹理 ID 的函数。

这是我目前所拥有的,但它给出了带有随机混杂颜色条纹的奇怪输出:

unsigned int colorToTexture(glm::vec3 color, const int size) {
    // Create id for texture
    unsigned int tex;
    // generate and bind texture
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    // set texture wrap parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    // set texture filter parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // set image data
    unsigned char* data = new unsigned char[size * size * sizeof(unsigned char)];
    for (unsigned int i = 0; i < (int)(size * size * sizeof(unsigned char)) / 3; i ++) {
        data[i * 3] = (int)(color.x * 255);
        data[i * 3 + 1] = (int)(color.y * 255);
        data[i * 3 + 2] = (int)(color.z * 255);
    }
    // set texture data and generate mipmaps
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
    // free image memory
    delete[] data;
    return tex;
}

这是它的一个示例(请注意,它适用于从加载的文件生成的常规纹理):

【问题讨论】:

  • glTexImage2D 调用之前尝试使用glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
  • 用纯色创建sizexsize texutre 有什么意义?这既会消耗更多内存,也会比仅使用 1x1 慢。
  • 我这样做是为了以后在编辑器中添加编辑纹理的功能。我还认为使用 1x1 纹理可能不起作用,因为它的尺寸必须是 2 的幂(虽然 1 是 2 的 0 次方,但对我来说似乎有点冒险)
  • 1x1 纹理从一开始就可以正常工作,但“2 的幂”要求在 20 年前就下降了。

标签: opengl textures glteximage2d


【解决方案1】:

您仅将 1/3 的数据上传到该纹理中,这很可能是问题所在,请尝试以下代码:

// set image data
unsigned char* data = new unsigned char[3 * size * size * sizeof(unsigned char)];
for (unsigned int i = 0; i < size  * size; i++) 
{
    data[i * 3] = (unsigned char)(color.x * 255.0f);
    data[i * 3 + 1] = (unsigned char)(color.y * 255.0f);
    data[i * 3 + 2] = (unsigned char)(color.z * 255.0f);
}

此外,glTexImage2D 调用应该是这样的,因为只有 RGB 值被放入数据变量中:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

【讨论】:

  • 虽然这会使工件看起来更少,但问题仍然存在。但是,如果我还将 glTexImage2D 行更改为使用 GL_RGB 格式,则一切正常。我之前注意到了这一点并对其进行了更改,但它并没有解决问题,所以我将其更改回来,而没有考虑它实际上如何解决问题的一部分。谢谢你的回复,这很有意义。我以前从未创建过这样的纹理,所以它很有帮助且信息丰富。
  • @CodeMan 所以这意味着你完全修复了它或者问题仍然出现?
  • 我完全修复了它,我只是将另一部分添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多