2015-01-20 192 views
0

前幾天我應用最新的Windows 8.1更新到我的筆記本電腦,當重新啓動作爲過程的一部分,我得到了藍屏,我也是如此,當我試圖手動重新啓動等。最後,我必須進行部分重置(它會刪除任何Windows認定爲應用程序但保留您的數據完好無損),因爲我不能丟失數據。OpenGL紋理不

之前,我的代碼顯示紋理和動畫模型的工作,但之後,我從我的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。

+0

我會開始一些錯誤檢查ING。我不使用Qt,但是'img'可能無效而無效?你也可以檢查'asdf'在調用'QOpenGLShaderProgram :: uniformLocation'之後保持適當的統一位置。 – gmbeard 2015-01-20 22:10:57

+0

你的筆記本電腦是否也有英特爾高清集成GPU?更新後,我的筆記本電腦默認開始使用它,而不是使用Nvidia GPU,它給我帶來了同樣奇怪的錯誤。 (如果您想知道,可以在Nvidia控制面板中設置默認的GPU - >管理3D設置。) – Jerem 2015-01-20 23:44:31

+0

@Jerem你有點解決了這個問題,我的筆記本電腦有「英特爾(R)高清顯卡4000」,但是在使用Nvidia顯卡時不用工作,只有在選擇「集成顯卡」作爲首選GPU時纔有效。根據我的理解,Nvidia GPU可以帶來更好更快的結果,所以我仍然在思考問題出在哪裏。 – Mognakor 2015-01-21 11:12:08

回答

1

好吧,我找到了解決方案。

我不知道的是glTexImage2D的內部格式和格式有所不同。

格式指定發送給GPU的數據的樣子,內部格式是GPU在內部使用的內容,這允許使用更少的格式。我的紋理以BGRA的形式存儲在內存中,但OpenGL不支持該格式。

Basicly我不得不改變:

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