2017-12-10 18 views
2

私はyoutubeのChernov @ sparkyエンジンのチュートリアルからopenGLプログラミングを学んでいます。現在私は頂点&を持っており、ウィンドウ、シェーダなどの管理に必要なクラスを持つフラグメントシェーダを持っています。私は単一の頂点配列オブジェクトを使って画面上に描画することができますが、同じことがvertexArrayクラスを作成することによって行われると失敗します。 頂点配列クラス:頂点配列のクラスでの問題

#include"vertexArray.h" 
namespace graphics{ 
VertexArray::VertexArray(){ 
    glGenVertexArrays(1,&arrayID); 

} 
void VertexArray::addBuffer(Buffer* buffer, GLint index){ 
    bind(); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, arrayID); 
    glEnableVertexAttribArray(index); 
    glVertexAttribPointer(index, buffer->getComCount(), GL_FLOAT, GL_FALSE, 0, 0); 


} 
void VertexArray::bind() const{ 
    glBindVertexArray(arrayID); 
} 
void VertexArray::unbind() const{ 
    glBindVertexArray(0); 
} 
VertexArray::~VertexArray(){ 
} 
} 

私のmain.cppにファイル

#include"graphics\window.h" 
    #include"utils\reader.h" 
    #include"graphics\shader.h" 
    #include"math\vec.h" 
    #include"math\mat4.h" 
    #include"graphics\buffers\buffer.h" 
    #include"graphics\buffers\indexbuffer.h" 
    #include"graphics\buffers\vertexArray.h" 
    using namespace graphics; 
    using namespace utils; 
    using namespace math; 
    int main(){ 
     Window window; 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glClearColor(0, 0, 0, 1); 
     Reader read1("src/shaders/test.vert"); 
     Reader read2("src/shaders/test.frag"); 
     char * r1 = read1.getData(); 
     char * r2 = read2.getData(); 

     GLfloat vert[] = { 
      0, 0, 0, 
      0, 3, 0, 
      8, 0, 0, 
      8, 3, 0, 
     }; 
     Buffer* vbo = new Buffer(vert,4*3,3); 

     GLushort indices[] = { 
      0,1,2, 
      1,3,2 
     }; 
     indexBuffer ibo(indices,6); 

     Shader shader(r1, r2); 
     shader.enable(); 
    #if 0 
     GLuint sprite1; 
     glGenVertexArrays(1, &sprite1); 
     glBindVertexArray(sprite1); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sprite1); 
     vbo->bind(); 
     glVertexAttribPointer(0, vbo->getComCount(), GL_FLOAT, 0, 0, 0); 
     shader.setUniformMat4("pr_matrix", mat4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); 
     shader.setUniformMat4("ml_matrix", mat4::translation(vec3(0, 0, 0))); 
     shader.setUniform2f("light_pos", vec2(8.0f, 4.5f)); 
     shader.setUniform4f("colour", vec4(0.2, 0.0, 0.4, 1)); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 

     GLuint sprite2; 
     glGenVertexArrays(1, &sprite2); 
     glBindVertexArray(sprite2); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, sprite2); 
     vbo->bind(); 
     glVertexAttribPointer(5, vbo->getComCount(), GL_FLOAT, 0, 0, 0); 
     shader.setUniformMat4("pr_matrix", mat4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); 
     shader.setUniformMat4("ml_matrix", mat4::translation(vec3(4, 3, 0))); 
     shader.setUniform2f("light_pos", vec2(8.0f, 4.5f)); 
     shader.setUniform4f("colour", vec4(0.3, 0.0, 0.2, 1)); 
     glEnableVertexAttribArray(0); 
     glBindVertexArray(0); 
    #endif 
     VertexArray vao; 
     vao.addBuffer(vbo, 0); 

     while (!window.closed()){ 

    #if 0 
      window.clear(); 

      glDrawArrays(GL_TRIANGLES, 0,6); 
    #endif 
      double x, y; 
      x = window.getX(); 
      y = window.getY(); 

      vao.bind(); 
      ibo.bind(); 
      shader.setUniform2f("light_pos", vec2((float) (x*16.0f/960.0f) , (float) (9- 9*y/540.0f))); 

      glDrawElements(GL_TRIANGLES, ibo.getCount(), GL_UNSIGNED_SHORT, 0); 
      window.update(); 

      vao.unbind(); 
      ibo.unbind(); 
     } 
     return 0; 
    } 

私はちょうどそれを使用する主な&でGLuint変数に頂点配列を作成する場合はすべてが動作することに注意してください。 ここで問題を見つけることはできません。 どんな助力もありがとうございます。

+0

!!私は頭がおかしくなりました。私は喜んで泣きました。多くの方々に感謝しています。 – pragi23

答えて

1

データをバッファにバインドする必要があります(glBufferDataを参照)。

GLfloat vert[] = { 
    0, 0, 0, 
    0, 3, 0, 
    8, 0, 0, 
    8, 3, 0, 
}; 

GLuint vbo; 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*4, vert, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

要素バッファは次のように作成することができます:

GLushort indices[] = { 
    0,1,2, 
    1,3,2 
}; 

GLuint ibo; 
glGenBuffers(1, &ibo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3*2, indices, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

Vertex Array Objectと頂点属性ポインタは、次のように指定されています

頂点バッファは次のように作成することができます属性

GLuint attr_index = 0; // attribute index according to the shader program 

GLuint vao; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer(attr_index , 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(attr_index); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 

glBindVertexArray(0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

注:Vertex Array Object頂点属性(書式、サイズ、属性インデックスなど)について指定したすべての情報を格納し、要素配列バッファを参照します。


最後に、あなたはこのようにメッシュを描くことができます:私の神のooh Rabbid76 @

glBindVertexArray(vao); 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
glBindVertexArray(0); 
+1

非常に有益な情報でした。 – pragi23

+0

@ Rabbid76: "*バッファーの適切なターゲットを使用する必要があります。*" [バッファーオブジェクト](https://www.khronos.org/opengl/wiki/Buffer_Object)は*タイプ*です。ではない。 *バッファオブジェクトの用途*はタイプされていますが、バッファオブジェクトはタイプに直接関連付けられていません。 'GL_COPY_READ_BUFFER'を使用してストレージを作成する際に、あなたが停止することはありません。 –

+0

@NicolBolas私はあなたが何を意味するのか正確にはわからないと思います。答えが悪いと思うなら、それを削除してください。私の答えは受け入れられるので、私はそれをすることができません。 – Rabbid76

関連する問題