簡體   English   中英

OpenGL,Shader Model 3.3紋理:黑色紋理?

[英]OpenGL, Shader Model 3.3 Texturing: Black Textures?

我幾個小時以來一直在反對這個問題,我確信這很簡單,但我無法得到結果。 我不得不稍微編輯這段代碼,因為我已經構建了一個小的庫來封裝OpenGL調用,但以下是對事態的准確描述。

我正在使用以下頂點着色器:

#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);
}

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

在我的init部分中,我加載了一個像這樣的紋理:

// 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錯誤,並且會繪制一個三角形以進行篩選。 但是,它看起來像這樣:

紋理,不像預期的那樣。

我想到問題可能與我的紋理坐標有關。 因此,我使用s作為“紅色”組件渲染以下圖像,並將t作為“綠色”組件:

使用st坐標着色。

紋理坐標看起來是正確的,但我仍然收到厄運的黑色三角形。 我究竟做錯了什么?

我認為它可能取決於紋理對象的不完整初始化。

嘗試初始化紋理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);

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

再見

在片段着色器中,您正在寫入自定義目標

   fragment_colour = texture2D(base_texture, varying_uv);

如果那不是gl_FragColorgl_FragData[…] ,你是否正確設置了指定的片段數據位置?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM