【问题标题】:OpenGL texturing doesn'tOpenGL纹理不
【发布时间】:2015-01-21 19:44:58
【问题描述】:

几天前,我在笔记本电脑上应用了最新的 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。

【问题讨论】:

  • 我将从一些错误检查开始。我不使用 Qt,但 img 是否可能在不抛出的情况下无效?您还可以在调用QOpenGLShaderProgram::uniformLocation 后检查asdf 是否拥有正确的统一位置。
  • 您的笔记本电脑是否也配备了 Intel HD 集成 GPU?更新后,我的笔记本电脑默认开始使用它而不是使用 Nvidia GPU,它让我突然出现了同样类型的奇怪错误。 (如果您想知道,您可以在 Nvidia 控制面板中设置默认 GPU -> 管理 3D 设置。)
  • @Jerem 你有点解决了这个问题,我的笔记本电脑有“Intel(R) HD Graphics 4000”,但是在使用 Nvidia 显卡时它不能工作,它只在选择“集成显卡”作为首选时工作显卡。据我了解,Nvidia GPU 会提供更好更快的结果,所以我仍然想知道问题出在哪里。

标签: c++ qt opengl


【解决方案1】:

好的,我找到了解决方案。

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

格式指定您发送到 GPU 的数据是什么样的,而 internalformat 是 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 的第三个参数)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2014-07-10
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多