2012-01-11 156 views
4

我幾個小時以來一直在抨擊我的頭,現在我確定它很簡單,但我無法得到結果。我不得不稍微編輯這段代碼,因爲我已經構建了一個小庫來封裝OpenGL調用,但以下內容是對事件狀態的精確描述。OpenGL,Shader Model 3.3紋理:黑色紋理?

我用下面的頂點着色器:

#version 330 
in vec4 position; 
in vec2 uv; 
out vec2 varying_uv; 
void main(void) 
{ 
    gl_Position = position; 
    varying_uv = uv; 
} 

而下面的片段着色器:

#version 330 
in vec2 varying_uv; 
uniform sampler2D base_texture; 
out vec4 fragment_colour; 
void main(void) 
{ 
    fragment_colour = texture2D(base_texture, varying_uv); 
} 

兩個着色器編譯沒有問題的程序的鏈接。

在我的初始化部分,我打開一個單獨的紋理像這樣:

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

// Load an image. 
QImage image("G:/test_image.png"); 
image = image.convertToFormat(QImage::Format_RGB888); 

if(!image.isNull()) 
{ 
    // Load up a single texture. 
    glGenTextures(1, &Texture); 
    glBindTexture(GL_TEXTURE_2D, Texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits()); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

你會看到,我使用Qt來加載紋理。對:: throw_on_error()的調用會檢查OpenGL中的錯誤(通過調用Error()),並在出現異常時引發異常。此代碼中不會出現OpenGL錯誤,並且使用Qt加載的圖像是有效的。如下進行

繪圖:

// Clear previous. 
glClear(GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT | 
    GL_STENCIL_BUFFER_BIT); 

// Use our program. 
glUseProgram(GLProgram); 

// Bind the vertex array. 
glBindVertexArray(GLVertexArray); 

/* ------------------ Setting active texture here ------------------- */ 

// Tell the shader which textures are which. 
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture"); 
glUniform1i(tAddr, 0); 

// Activate the texture Texture(0) as texture 0. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, Texture); 

/* ------------------------------------------------------------------ */ 

// Draw vertex array as triangles. 
glDrawArrays(GL_TRIANGLES, 0, 4); 
glBindVertexArray(0); 
glUseProgram(0); 

// Detect errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

同樣,不發生錯誤的OpenGL和三角形被吸引到screeen。然而,它看起來像這樣:

Texturing, not as expected.

我突然想到這個問題可能與我的紋理座標。所以,我使用呈現S作爲「紅色」部分下面的圖片,和T作爲「綠色」成分:

Coloring using st coordinates.

紋理座標顯示正確,但我仍然收到的黑三角厄運。我究竟做錯了什麼?

回答

9

我認爲這可能取決於你的紋理對象的不完整初始化。

嘗試初始化紋理MIN和MAG過濾

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

此外,我建議要檢查紋理的大小。如果不是2的冪,那麼你必須圍繞設置包裝模式,以CLAMP_TO_EDGE

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

黑色紋理往往是由於這個問題,很常見的問題。

+0

我不認爲這是相關的。如果他們沒有設置,那麼將使用默認值 – 2012-01-11 11:38:09

+0

你先生,是男人之神! @VJovic我以爲完全一樣的東西:)。 – 2012-01-11 12:16:53

+0

哇這也解決了我的問題。看起來'GL_TEXTURE_MIN_FILTER'沒有具體的默認值。 – Henk 2012-08-05 16:33:21

2

在你的片段着色器你寫一個自定義的目標

fragment_colour = texture2D(base_texture, varying_uv); 

如果這不是要gl_FragColorgl_FragData[…],你有沒有正確設置指定的片段數據的位置?

+0

好吧,gl_FragColor不推薦使用,gl_FragData也不推薦使用。 Post 1.2(我認爲)你需要使用並綁定到緩衝區。鑑於我可以把所有其他事情都弄好,我不認爲是這個問題。 – 2012-01-11 12:10:46

+0

@LiamM:的確,但我想知道你是否無意中錯過了這一點。 – datenwolf 2012-01-11 15:03:29