OpenGL 纹理不会

OpenGL texturing doesn't

本文关键字:纹理 OpenGL      更新时间:2023-10-16

几天前,我将最新的 Window 8.1 更新应用于我的笔记本电脑,作为过程的一部分重新启动时,我出现蓝屏,当我尝试手动重新启动等时也是如此。最后,我不得不进行部分重置(它会删除Windows识别为应用程序的任何内容,但保留您的数据)为您提供,因为我不会丢失数据。

在那

次事件之前,我用于显示纹理和动画模型的代码可以工作,但在那之后,由于关键字已弃用,我从 GLSL 编译器中收到了新错误。修复这些问题后,我的程序不会向我显示纹理,而只会显示所有黑色内容。

我有 2 个使用相同的 glsl 代码的旧项目,它们也有同样的问题(尽管它们在着色器中没有任何不推荐使用的关键字)。

代码在我进行更新前 ~2 小时是这样工作的。

正在初始化:

void TestWindow::initialize()
{
initSkybox();
initVAO();
initVBO();
m_program = new QOpenGLShaderProgram(this);
m_program->addShaderFromSourceFile(QOpenGLShader::Vertex    ,"../Qt_Flyff_1/Simple_VertexShader.vert");
m_program->addShaderFromSourceFile(QOpenGLShader::Fragment  ,"../Qt_Flyff_1/Simple_FragmentShader.frag");
m_program->link();
qDebug("log: %s",m_program->log().toStdString().c_str());
m_posAttr = m_program->attributeLocation("position");
m_texPos = m_program->attributeLocation("texcoord");
m_colorUniform = m_program->uniformLocation("color");
m_matrixUniform = m_program->uniformLocation("matrix");
int asdf=m_program->uniformLocation("tex");

GLuint tex;
glGenTextures(1, &tex);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
QImage img("../skybox01_big.png");
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, img.width(), img.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, img.bits());
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glEnable(GL_DEPTH_TEST);
//  glEnable(GL_CULL_FACE);
glClearColor(0.5,0.5,0.5,1.0);
m_program->setUniformValue(asdf,0);
}

顶点着色器:

#version 400 core
uniform mediump mat4 matrix;
uniform mediump vec3 color;
in vec4 position;
in vec2 texcoord;
out vec3 Color;
out vec2 Texcoord;
void main()
{
   Color = color;
   Texcoord = texcoord;
   gl_Position = matrix*position;
}

片段着色器:

#version 400 core
in vec3 Color;
in vec2 Texcoord;
out vec4 outColor;
uniform sampler2D tex;
void main()
{
   outColor = texture(tex, Texcoord) * vec4(Color, 1.0);
}

我还将我的代码与各种教程进行了比较,但找不到任何区别。

当简单地使用"outColor = vec4(Color,1.0)"时,我的模型完全是白色的,当将纹理坐标显示为颜色时,我也得到了预期的结果。

万一重要,我的笔记本电脑有GeForce GT 740M。

好的,

我找到了解决方案。

我不知道的是,内部格式和glTexImage2D格式之间存在差异。

格式指定您发送到 GPU 的数据的外观,内部格式是 GPU 内部使用的格式,这允许较少的格式。我的纹理作为BGRA存储在内存中,但OpenGL不允许这种格式。

基本上我不得不改变:

glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, img.width(), img.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, img.bits());

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(), img.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, img.bits());

(从GL_BGRA到GL_RGBA的第3个参数)

有关哪些类型可用于内部格式的信息可以在此处找到:https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml