Создание цветовой текстуры A Solid в OpenGL - PullRequest
1 голос
/ 07 августа 2020

У меня вопрос по созданию текстур без файла. Моя цель - создать функцию, которая принимает цвет vec3 в качестве входных данных и возвращает идентификатор текстуры для этой текстуры.

Это то, что у меня есть до сих пор, но она дает нечетные выходные данные с полосами случайных смешанных цветов :

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;
}

Вот пример того, что он делает (обратите внимание, что он отлично работает с обычными текстурами, созданными из загруженных файлов): Необычный вывод сгенерированной текстуры

1 Ответ

2 голосов
/ 07 августа 2020

Вы загружаете только 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);
...