【发布时间】: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 会提供更好更快的结果,所以我仍然想知道问题出在哪里。