2016-08-14 7 views
0

現在、私はメッシュクラスで三角形を描画しようとしています。私はこれを最初にグライと私のWindowクラスのWindow.initializeGraphicsメソッドを呼び出して初期化し、頂点の配列を作成し、私のMesh.addVerticiesメソッドに渡します。各頂点には3つの浮動小数点数x、y、zがあります。その後、メインゲームループのすべてのティックをMesh.drawメソッドと呼びます。3つの浮動小数点(x、y、z)を持つ頂点の配列を持つglBufferData

initializeGraphics方法:メッシュを作成する

void Window::initializeGraphics() 
{ 
    glClearColor(0, 0, 0, 0); 

    glFrontFace(GL_CW); 
    glCullFace(GL_BACK); 
    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 

    glEnable(GL_FRAMEBUFFER_SRGB); 
} 

m_Mesh = Mesh(); 

    Vertex data[] = { Vertex(vec3(-1, -1, 0)), 
         Vertex(vec3(1, -1, 0)), 
         Vertex(vec3(0, 1, 0)) }; 

    m_Mesh.addVerticies(data); 

メッシュヘッダ:

#include "vertex.h" 
#include <GLEW\glew> 
class Mesh 
{ 
private: 
    GLuint m_Vbo; 
    int m_Size; 
public: 
    Mesh(); 
    void addVerticies(Vertex verticies[]); 
    void draw(); 
}; 

メッシュC++ファイル:

#include "mesh.h" 
Mesh::Mesh() 
{ 
    glGenBuffers(1, &m_Vbo); 
} 

void Mesh::addVerticies(Vertex verticies[]) 
{ 
    m_Size = (sizeof(verticies)/sizeof(*verticies)); 

    glBindBuffer(GL_ARRAY_BUFFER, m_Vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW); 
} 

void Mesh::draw() 
{ 
    glEnableVertexAttribArray(0); 

    glBindBuffer(GL_ARRAY_BUFFER, m_Vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * 4, 0); 
    glDrawArrays(GL_TRIANGLES, 0, m_Size); 
    glDisableVertexAttribArray(0); 
} 

頂点ヘッダー:

#include "vec3.h" 
struct Vertex 
{ 
    union 
    { 
     vec3 pos; 
     struct 
     { 
      float x, y, z; 
     }; 
    }; 
    Vertex(vec3 pos_); 
}; 

頂点C++ファイル:

#Include "vertex.h" 
Vertex::Vertex(vec3 pos_) 
{ 
    pos = pos_; 
} 

Renderメソッドを:

void MainComponent::render() 
{ 
    m_Window.clear(); 

    m_Mesh.draw(); 

    m_Window.update(); 
} 
//m_Window.update(); 
void Window::update() 
{ 
    glfwSwapBuffers(m_GLFWWindow); 
    glfwPollEvents(); 
} 
//m_Window.clear(); 
void Window::clear() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
} 

問題には三角形が画面に表示されていない、です。私は間違って何をしていますか?私はまだC++のニュールーリングですが、OpenGlを初めてプログラミングするので、見逃してしまうことが本当に本当に基本的なものになる可能性があります。

ご協力いただきありがとうございます。

-Sean

+0

glBufferData(GL_ARRAY_BUFFER、sizeof(頂点)、頂点、GL_STATIC_DRAW)。 sizeof(頂点)の値が正しいかどうか確認してください。また、シェーダコードはどこですか? –

+0

@ PedroDavidあまりにもありがとう、それを修正する必要はありません。私はそれがレンダリングされなかった理由を発見した。 –

答えて

0

私は完全なバカのように感じる...一つverticieは、画面の外でした。私はそれを一日と呼ぶと思う:/

+0

これは、クリッピングがどのように動作するはずではありません。ポリゴン内の1つの頂点が「オフスクリーン」(ビューボリューム外)である場合、残りの部分はまだ塗りつぶされています。 –

+0

残りの2つが下部コーナーにあり、見つからないものがそれらの下にあるときはありません –

1

うわー、そこに握って!ここには真実の誤りがいくつかあります。

void Mesh::addVerticies(Vertex verticies[]) 
{ 
    // This gives the wrong answer! 
    m_Size = (sizeof(verticies)/sizeof(*verticies)); 

m_Sizeの計算は完全に間違っています。これは、verticiesポインタではないためです。配列のように見えますが、それはVertex verticies[]と宣言されましたが、C++の癖(C言語にも同じ)のために、パラメータはポインタに崩壊します。だから、これと同じされて終わる:あなたが見ることができるように

void Mesh::addVerticies(Vertex *verticies) 

あなただけのポインタのサイズを取得しているので、sizeof(verticies)は常に、典型的な64ビットシステム上で8ではないだろう配列のサイズ

私たちは、テンプレートで配列のサイズをキャプチャすることにより、この問題を解決することができます

template <std::size_t N> 
void addVertices(Vertex (&vertices)[N]) { 
    addVertices(vertices, N); 
} 

void addVertices(Vertex *vertices, std::size_t count) { 
    m_Size = count; 

    glBindBuffer(GL_ARRAY_BUFFER, m_Vbo); 
    glBufferData(
     GL_ARRAY_BUFFER, 
     sizeof(*vertices) * count, 
     vertices, 
     GL_STATIC_DRAW); 
} 

我々は配列への参照を使用しているため、Vertex (&vertices)[N]を、配列の代わりに、直接、Vertex vertices[N]を、パラメータが減衰しませんポインタに変換する。

+0

私は質問を投稿した後すぐに気づきました。私は今 'm_Size = sizeof(* verticies)/ sizeof(verticies);を使いますが、うまくいくようです。 –

+0

@ SeanO'Hanlon:それは間違っています。 'vertof'はポインタなので、' sizeof(* verticies)/ sizeof(verticies) 'は正解を返しませんので、配列の大きさに関わらず常に同じ結果が得られます。 –

+0

それを指摘してくれてありがとう:-)私はまだ多くのことを学びました。 –

関連する問題