QOpenGLTexture загружается или связывается с шейдером как монохромное изображение - PullRequest
0 голосов
/ 03 мая 2019

Я делаю приложение OpenGL в Qt, и у меня проблемы с текстурами. Мои объекты окрашены монохромной текстурой, но мои изображения - это цветные изображения в формате .png. У меня было приложение donde в Visual Studio с программированием на C ++, и оно хорошо работает.

Я пытался отключить освещение, но оно не дает никаких изменений. Я также попытался заставить шейдер закрасить все объекты красным, и это работает, поэтому поверхность позволяет мне рисовать цветами. Кроме того, у меня есть режим, в котором я не использую текстуры, я просто рисую материалами, и все работает отлично. Я видел пример, предоставленный Qt, и у него не так много различий с моим. То, как создается текстура, похоже на мое, и в этом примере куб окрашен цветной текстурой.

Это класс текстур:

texture::texture()
{
    initializeOpenGLFunctions();
}

texture::texture(QVector<QString> rutas, QVector<TexturesTypes> tipo)
{
    initializeOpenGLFunctions();
    for (int i = 0; i < rutas.size(); i++)
    {


        QString filename = rutas[i];
        TexturesTypes tipoTextura = tipo[i];
        QImage imagen = QImage(filename);

        if(imagen.isNull())
        {
            std::cout<<"IS NULL"<<std::endl;
        }

        QOpenGLTexture *texture = new QOpenGLTexture(QImage(filename).mirrored());

        if (texture == nullptr)
        {
            std::cout << filename.toStdString() << " cannot be loaded" << std::endl;
            return;
        }
        std::cout<<"Textura cargada correctamente"<<std::endl;

        //Construimos la textura con las imágenes que queremos y la función de cada imagen
        switch (tipoTextura)
        {
            case COLOR:
            {
                color = texture;
                color->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
                color->setMagnificationFilter(QOpenGLTexture::Linear);
                color->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::ClampToEdge );
                color->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::ClampToEdge );
                color->generateMipMaps();

                break;
            }
            case BRILLO:
            {
                brillo = texture;
                brillo->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
                brillo->setMagnificationFilter(QOpenGLTexture::Linear);
                brillo->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::ClampToEdge );
                brillo->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::ClampToEdge );
                brillo->generateMipMaps();
                break;
            }
            case BUMPMAPPING:
            {
                bumpMapping = texture;
                bumpMapping->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
                bumpMapping->setMagnificationFilter(QOpenGLTexture::Linear);
                bumpMapping->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::ClampToEdge );
                bumpMapping->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::ClampToEdge );
                bumpMapping->generateMipMaps();
                break;
            }

            case DISPLACEMENTMAPPING:
            {
                displacementMapping = texture;
                displacementMapping->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
                displacementMapping->setMagnificationFilter(QOpenGLTexture::Linear);
                displacementMapping->setWrapMode(QOpenGLTexture::DirectionS,QOpenGLTexture::ClampToEdge );
                displacementMapping->setWrapMode(QOpenGLTexture::DirectionT,QOpenGLTexture::ClampToEdge );
                displacementMapping->generateMipMaps();
                break;
            }

        }

    }

}


/**
 * @brief Obtener una de las imágenes que forman la textura
 * @param tipo Tipode imagen que se quiere obtener
 * @return imagen Puntero a la imagen que se ha obtenido
 */

QOpenGLTexture* texture::getTextura(TexturesTypes tipo)
{
    switch (tipo)
    {
        case COLOR:
        {
            return this->color;
        }
        case BRILLO:
        {
            return this->brillo;
        }

        case BUMPMAPPING:
        {
            return this->bumpMapping;
        }
        case DISPLACEMENTMAPPING:
        {
            return this->displacementMapping;
        }
    }
}

/**
 * @brief Aplicar la textura al shader
 * @param shader Shader al que se le va a aplicar la textura
 */

void texture::aplicar(shaderProgram* shader)
{
    shader->use();
    if (color != nullptr)
    {
        shader->setUniform("TexSamplerColor", 0);
        color->bind(GL_TEXTURE0);
    }
    if (brillo != nullptr)
    {
        shader->setUniform("TexSamplerBrillo", 1);
        brillo->bind(GL_TEXTURE1);
    }
}


texture::~texture()
{
    color->destroy();
    brillo->destroy();
    bumpMapping->destroy();
    displacementMapping->destroy();
    delete color;
    delete brillo;
    delete bumpMapping;
    delete displacementMapping;
}

Это фрагментный шейдер:

#version 400

in vec3 position;
in vec3 normal;
in vec2 texCoord;

uniform vec3 lightPosition;
uniform vec3 Ia;
uniform vec3 Id;
uniform vec3 Is;

uniform sampler2D TexSamplerColor;
uniform sampler2D TexSamplerBrillo;

layout (location = 0) out vec4 FragColor;

vec3 ads(vec4 texColor, vec4 texBrillo)
{
    vec3 Kad = texColor.rgb;
    vec3 Ks = texBrillo.rgb;
    float Shininess = texBrillo.a;
    Shininess = Shininess*200;

    vec3 n;
    if (gl_FrontFacing) {
        n = normalize(normal);
    } else {
        n = normalize(-normal);
    }
    vec3 l = normalize( lightPosition-position );
    vec3 v = normalize( -position );
    vec3 r = reflect( -l, n );
    return (Ia * Kad) + (Id * Kad * max( dot(l, n), 0.0)) + (Is * Ks * pow( max( dot(r,v), 0.0), Shininess ));
}

void main() {
    vec4 texColor = texture(TexSamplerColor, texCoord);
    vec4 texBrillo = texture(TexSamplerBrillo, texCoord);
        FragColor = vec4(ads(texColor,texBrillo), 1.0);
}

Я ожидал, что текстуры будут хорошо применяться к моим объектам, но у меня есть все объекты с монохроматической текстурой.

Я не могу публиковать изображения из-за своей репутации, поэтому я оставляю вам ссылку здесь: https://i.ibb.co/brTgchK/textura.png

...