我幾個小時以來一直在抨擊我的頭,現在我確定它很簡單,但我無法得到結果。我不得不稍微編輯這段代碼,因爲我已經構建了一個小庫來封裝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。然而,它看起來像這樣:
我突然想到這個問題可能與我的紋理座標。所以,我使用呈現S作爲「紅色」部分下面的圖片,和T作爲「綠色」成分:
紋理座標顯示正確,但我仍然收到的黑三角厄運。我究竟做錯了什麼?
我不認爲這是相關的。如果他們沒有設置,那麼將使用默認值 – 2012-01-11 11:38:09
你先生,是男人之神! @VJovic我以爲完全一樣的東西:)。 – 2012-01-11 12:16:53
哇這也解決了我的問題。看起來'GL_TEXTURE_MIN_FILTER'沒有具體的默認值。 – Henk 2012-08-05 16:33:21