Я делаю приложение 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