簡體   English   中英

OpenGL 3.3無法渲染任何紋理(黑色紋理,C ++,GLFW / SOIL)

[英]OpenGL 3.3 no texture gets rendered (black texture, C++, GLFW/SOIL)

我目前正在使用C ++和GLFW(以及用於加載圖像文件以創建紋理的SOIL)學習OpenGL 3.3。 我已經實現了一個批處理渲染系統,該系統采用頂點信息,將VBO數據映射到緩沖區變量,每幀將提交的頂點信息寫入該緩沖區並渲染該幀。

renderer.cpp看起來像這樣: http ://pastebin.com/N6nWdew6,而在renderer.hpp中將VertexData結構定義為:

struct VertexData {
    VertexData()
        :   vertex(glm::vec3(0.0f, 0.0f, 0.0f)),
            color(glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)),
            texCoord(glm::vec2(0.0f, 0.0f)),
            tid(0) {};

    VertexData(glm::vec3 vertex, glm::vec4 color, glm::vec2 texCoord, GLuint tid)
        :   vertex(vertex),
            color(color),
            texCoord(texCoord),
            tid(tid) {};

    ~VertexData() {};

    glm::vec3   vertex;
    glm::vec4   color;
    glm::vec2   texCoord;
    GLuint      tid;
};

現在,提交和渲染實際的頂點,顏色信息,紋理坐標等似乎可以正常工作,但是紋理仍然無法渲染,我得到的只是一個黑色正方形。 主循環中實際提交的最重要部分如下所示(警告:看起來很糟糕,僅出於測試目的;我已盡力將其縮短)。

[...]

/*Static variables in the window class, just for testing purposes*/
Shader*                 Window::_exampleShader = nullptr;
Texture*                Window::_exampleTexture = nullptr;
Renderer::VertexData    Window::vA;
Renderer::VertexData    Window::vB;
Renderer::VertexData    Window::vC;
Renderer::VertexData    Window::vD;

[...]

/*Initialization in the window constructor*/
_exampleShader  = new Shader("../src/glsl/basicVertex.glsl", "../src/glsl/basicFragment.glsl");
_exampleTexture = new Texture("../res/test.png");

/*TOP LEFT*/
vA.vertex       = glm::vec3(-0.5f, 0.5f, 0.0f);
vA.color        = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
vA.texCoord     = glm::vec2(0.0f, 1.0f);
vA.tid          = _exampleTexture->getTextureID();

/*TOP RIGHT*/
vB.vertex       = glm::vec3(0.5f, 0.5f, 0.0f);
vB.color        = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
vB.texCoord     = glm::vec2(1.0f, 1.0f);
vB.tid          = _exampleTexture->getTextureID();

/*BOTTOM LEFT*/
vC.vertex       = glm::vec3(-0.5f, -0.5f, 0.0f);
vC.color        = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
vC.texCoord     = glm::vec2(0.0f, 0.0f);
vC.tid          = _exampleTexture->getTextureID();

/*BOTTOM RIGHT*/
vD.vertex       = glm::vec3(0.5f, -0.5f, 0.0f);
vD.color        = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
vD.texCoord     = glm::vec2(1.0f, 0.0f);
vD.tid          = _exampleTexture->getTextureID();

[...]

/*Submission in the main loop*/
_exampleShader->bind();
_exampleTexture->bind();

_exampleShader->setUniformMat4("model_matrix", glm::mat4(1.0f));
_exampleShader->setUniformMat4("view_matrix", glm::lookAt(glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, 1.0f, 0.0f)));
_exampleShader->setUniformMat4("projection_matrix", glm::perspective(ConversionUtils::convertFOV(90.0f), getAspectRatio(), 0.0001f, 100.0f));

Renderer::begin();      
    Renderer::submit(vC);
    Renderer::submit(vA);
    Renderer::submit(vB);

    Renderer::submit(vC);
    Renderer::submit(vD);
    Renderer::submit(vB);
Renderer::end();

glfwSwapBuffers(_window);

[...]

如您所見,我創建了一些示例頂點數據並將其提交給每一幀。 現在,最后的代碼是我的頂點和片段着色器:

頂點着色器:

#version 330 core

layout(location = 0) in vec3 v_vertex;
layout(location = 1) in vec4 v_color;
layout(location = 2) in vec2 v_texCoord;
layout(location = 3) in uint v_tid;

out vec4 f_color;
out vec2 f_texCoord;
flat out uint f_tid;

uniform mat4 model_matrix;
uniform mat4 view_matrix;
uniform mat4 projection_matrix;

void main() {
    f_color     = v_color;
    f_texCoord  = v_texCoord;
    f_tid       = v_tid;

    mat4 mvp = projection_matrix * view_matrix * model_matrix;
    gl_Position = mvp * vec4(v_vertex, 1.0);
}

片段着色器:

#version 330 core

in vec4 f_color;
in vec2 f_texCoord;
flat in uint f_tid;

out vec4 color;

uniform sampler2D texSampler;

void main() {
    color = texture(texSampler, f_texCoord);
}

這就是我正在使用的。 現在,我已經進行了一堆谷歌搜索,甚至在OpenGL頻道@ freenode上詢問了,但是沒有人可以幫我這個忙。 盡管我不應該這樣做,但我通過使用核心3.3配置文件(甚至是向前兼容的配置文件)刪除了不推薦使用的功能。 我已經檢查過的其他內容:

  • 我只使用一個具有有效GL上下文的線程,因此“在C ++類中打包OGL對象”可能沒有問題
  • 着色器和紋理都已綁定。 由於紋理采樣器和活動紋理默認情況下為0,因此也不會引起任何問題
  • 我實際上正在正確加載test.png(如果您感興趣,請加載texture.cpp: http ://pastebin.com/hWGTCe5C)
  • 我沒有使用過時的功能afaik,甚至沒有調用使用過時功能的SOIL函數; 在切換庫之前通過SDL2和SDL2_image加載圖像導致了相同的問題
  • 着色器獲取有效的紋理坐標(通過將其作為顏色輸出到我正在渲染的正方形進行測試)
  • 盡管設置了-Wall編譯器標志,但是無論着色器還是編譯器都不會向我發出任何警告/錯誤,glGetError()也不起作用

其他可能有用的信息:我已經使用Intel和Nvidia GPU在Antergos(Arch)Linux上的最新驅動程序(在Wayland上使用一個,在X11上使用一個)對它們進行了測試。 64位架構。 庫的最新版本(GLFW3,SOIL,GLEW和GLM)。 使用Clang ++編譯。 Valgrind也沒有給我任何有用的輸出。

我和IRC聊天室的想法都用光了-是什么原因引起的?

正如@RetoKoradi在他的評論中所說,您實際上並沒有將任何參數傳遞給紋理,因此您的紋理並不完整。

嘗試在texture.cpp中添加如下內容:

glBindTexture(GL_TEXTURE_2D, texture_id);
glTexImage2D(GL_TEXTURE_2D, 0, your_internal_format, width, height, 0, your_format, your_type, texture_pointer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, your_behavior);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, your_behavior);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
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);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

要么

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);

您可以在此處找到有關紋理完成度的更多信息: OpenGL常見錯誤 請注意,此鏈接中已解決@RetoKoradi所涉及的問題。

暫無
暫無

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

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