2016-05-15 15 views
0

現在、C++とGLFW(および画像ファイルを読み込んでテクスチャを作成するためのSOIL)を使用してOpenGL 3.3を学習しています。私は、頂点情報を取り、VBOデータをバッファ変数にマップし、送信された頂点情報をすべてのフレームにそのバッファに書き込み、前記フレームをレンダリングするバッチレンダリングシステムを実装しました。 VertexData構造体は次のようにrenderer.hppで定義されている間http://pastebin.com/N6nWdew6OpenGL 3.3では、テクスチャがレンダリングされません(黒いテクスチャ、C++、GLFW/SOIL)

renderer.cppは、次のようになり、実際の頂点を提出し、レンダリング、

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

[...] 

は、あなたが見ることができるように、Iいくつかの頂点データの例を作成し、すべてのフレームを送信します。さて、コードの最後のビットは、私の頂点とフラグメントシェーダです:

バーテックスシェーダ:

#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コンテキストにスレッドを1つ使用していますので、「C++クラスでOGLオブジェクトをパッケージ化」については問題
  • シェーダーとテクスチャの両方が、おそらくありません結合しています;テクスチャサンプラとアクティブなテクスチャはデフォルトでは0であることから、それは私が実際にきちんとtest.pngをロードしています何の問題のいずれか
  • が発生することはありません(texture.cppあなたが興味を持っている場合:http://pastebin.com/hWGTCe5C
  • 私はないです非推奨の機能afaikを使用すると、廃止された機能を使用するSOIL関数も呼び出されません。私は図書館を切り替える前にやったSDL2ウントSDL2_image、を介して画像を読み込む、シェーダが(私はレンダリングてる乗に色としてそれらを出力することによりテストした)有効なテクスチャ座標
  • どちらもシェーダを取得し、同じ問題
  • を引き起こしたりコンパイラは-WallコンパイラフラグがセットされていてもglGetError()が役に立ちませんでしたが、警告/エラーを表示します。

その他のインテルとNVIDIA GPU Antergos(Arch)Linuxで最新のドライバを使用しています(Waylandで1つ、X11で1つ)。 64ビットアーキテクチャ最新バージョンのライブラリ(GLFW3、SOIL、GLEW、GLM) Clang ++を使用してコンパイルされます。 Valgrindは私に有用な出力も与えません。

私とIRCのチャットルームでアイディアが不足しています - これは何が原因でしょうか?

+0

どのテクスチャサンプリングパラメータを使用していますか?古典的な間違いは 'GL_TEXTURE_MIN_FILTER'をミップマップサンプリングのためのデフォルト値にしておき、テクスチャのミップマップを持たないことです。 –

答えて

0

@RetoKoradiがコメントしたところでは、実際にはテクスチャにパラメータを渡していないため、テクスチャは完全ではありません。

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

あなたがここにテクスチャcompletnessの詳細情報を見つけることができます:OpenGL Common Mistakes

はtexture.cppでのようなものを追加してください。 @RetoKoradiが参照している問題は、このリンクで扱っていることに注意してください。

+0

あなたは2つだけ私の問題を修正!そんなにありがとう、これは私を狂ってしまった! –

関連する問題