2011-02-04 17 views
3

編集II:
現在のコードは素晴らしいです!みんな、ありがとう。私は先に進んで、実際にこの時点では絶対に何もしませんが、底に参照用のシェーダコードを含めました。コードアシスト、OpenGL VAO/VBOクラス描画なし

私はOpenGL 4.1を立ち上げようとしていますが、まだ開発の初期段階です。現在、私はこのプロジェクトではまだ4.0の機能を使っていません。だから、OpenGL 3の問題と同じくらいです。

私が最初に取り組んでいた目標は、単にVAOとVBOを扱う2つのクラスを用意することでした。私はいくつかの誤解を抱いていましたが、ついに空白の画面を過ぎてしまいました。

/* THIS CODE IS NOW FULLY FUNCTIONAL */ 
/* well, fully is questionable lol, should work out of the box with glew and glfw */ 

/* A simple function that will read a file into an allocated char pointer buffer */ 
/* Borrowed from OpenGL.org tutorial */ 
char* filePull(char *file) 
{ 
    FILE *fptr; 
    long length; 
    char *buf; 

    fptr = fopen(file, "r"); /* Open file for reading */ 
    if (!fptr) /* Return NULL on failure */ 
     return NULL; 
    fseek(fptr, 0, SEEK_END); /* Seek to the end of the file */ 
    length = ftell(fptr); /* Find out how many bytes into the file we are */ 
    buf = (char*)malloc(length+1); /* Allocate a buffer for the entire length of the file and a null terminator */ 
    fseek(fptr, 0, SEEK_SET); /* Go back to the beginning of the file */ 
    fread(buf, length, 1, fptr); /* Read the contents of the file in to the buffer */ 
    fclose(fptr); /* Close the file */ 
    buf[length] = 0; /* Null terminator */ 

    return buf; /* Return the buffer */ 
} 


class VBO 
{ 
    public: 

    GLuint buffer; 
    bool isBound; 
    vector<void*> belongTo; 
    vector<GLfloat> vertex; 
    GLenum usage; 

    void Load() 
    { glBufferData(GL_ARRAY_BUFFER, vertex.size()*sizeof(GLfloat), &vertex[0], usage); } 
    void Create(void* parent) 
    { 
     glGenBuffers(1, &buffer); 
     glBindBuffer(GL_ARRAY_BUFFER, buffer); 
     glBufferData(GL_ARRAY_BUFFER, vertex.size()*sizeof(GLfloat), &vertex[0], usage); 
     isBound=true; 
     belongTo.push_back(parent); 

    } 
    void Activate() 
    { 
     if(!isBound) glBindBuffer(GL_ARRAY_BUFFER, buffer); 
     isBound=true; 
    } 
    void Deactivate(){ glBindBuffer(GL_ARRAY_BUFFER, 0); } 

    VBO() : isBound(false), usage(GL_STATIC_DRAW) 
    {  } 
    ~VBO() { } 

    private: 
}; 

class VAO 
{ 
    public: 
    GLuint buffer; 
    string key; 
    unsigned long long cursor; 

    vector<VBO> child; 

    void Create() 
    { 
     glGenVertexArrays(1, &buffer); 
     for(unsigned int i=0; i<child.size(); i++) 
      child[i].Create(this); 
    } 
    void Activate() 
    { 
     glBindVertexArray(buffer); 
     for(unsigned int i=0; i<child.size(); i++) 
      child[i].Activate(); 
    } 
    void Release(){ glBindVertexArray(0); } 
    void Remove(){ glDeleteVertexArrays(1, &buffer); } 

    VAO() : buffer(1) {  } 
    ~VAO() {  } 

    private: 
}; 

int main() 
{ 
    int  width=640, height=480, frame=1; bool running = true; 

    glfwInit(); 

    if(!glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) 
    {  glfwTerminate(); return 13; } 
    glfwSetWindowTitle("Genesis"); 

    glewInit(); 
    cout<<(GLEW_VERSION_4_1?"yes":"no"); //yes 


    GLchar *vsource, *fsource; 
    GLuint _vs, _fs; 
    GLuint Shader; 

    vsource = filePull("base.vert"); 
    fsource = filePull("base.frag"); 

    /* Compile Shaders */ 
    _vs = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(_vs, 1, (const GLchar**)&vsource, 0); 
    glCompileShader(_vs); 
// glGetShaderiv(_vs, GL_COMPILE_STATUS, &IsCompiled_VS); 
    _fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(_fs, 1, (const GLchar**)&fsource, 0); 
    glCompileShader(_fs); 
/*****************^Vertex | Fragment v *********************/ 
    glAttachShader(Shader, _vs); 
    glAttachShader(Shader, _fs); 
// glGetShaderiv(_fs, GL_COMPILE_STATUS, &IsCompiled_FS); 
    glBindAttribLocation(Shader, 0, "posIn"); 
    glLinkProgram(Shader); 
// glGetProgramiv(shaderprogram, GL_LINK_STATUS, (int *)&IsLinked); 

    VAO Object3D; 
    VBO myVBO[3]; 

    glUseProgram(Shader); 

    for(int i=0; i<9; i++) 
     myVBO[0].vertex.push_back((i%9)*.11); //Arbitrary vertex values 

    Object3D.child.push_back(myVBO[0]); 
    Object3D.Create(); 

    glClearColor(0.7f, 0.74f, 0.77f, 0.0f); //Black got lonely 

    int i=0; while(running) 
    { 
     frame++; 

     glfwGetWindowSize(&width, &height); 
     height = height > 0 ? height : 1; 
     glViewport(0, 0, width, height); 
     glClear(GL_COLOR_BUFFER_BIT); 

     /* Bind, Draw, Unbind */ 
     Object3D.Activate(); 
     glEnableVertexAttribArray(0); 
     glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); 
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 9); 

     Object3D.Release(); 
     glfwSwapBuffers(); 

     // exit if ESC was pressed or window was closed 
     running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam(GLFW_OPENED); 
     i++; 
    } 

    glUseProgram(0); glDisableVertexAttribArray(0); 
    glDetachShader(Shader, _vs); glDetachShader(Shader, _fs); 
    glDeleteProgram(Shader); glDeleteShader(_vs); glDeleteShader(_fs); 
    glDeleteVertexArrays(1, &Object3D.buffer); 

    glfwTerminate(); 
    return 0; 
} 

基本的に私はこの時点で画面上に何かを得ることを望んでいます。私はglfwとglewを使用しています。私はいくつかのことを完全に残しているのですか、何かを訂正する必要がありますか?現時点でコードは多少乱暴ですが、残念です。 VBOのiBoundメンバーが疑わしいこと

base.vert

// Fragment Shader – file "base.vert"  
#version 300 

in vec3 posIn; 
out vec4 colorOut; 

void main(void) 
{ 
    gl_Position = vec4(posIn, 1.0); 
    colorOut = vec4(3.0,6.0,4.0,1.0); 
} 

base.frag

// Vertex Shader – file "base.frag" 
#version 300 

out vec3 colorOut; 

void main(void) 
{ 
    colorOut = vec3(1.0,10,1.0); 
} 
+0

"表示"と "カメラ"の設定が正しいことを100%確信していますか? – tauran

+0

絶対に手がかりがないので、おそらくそうではありません。私は良い休憩を取ると、それを調べます。 –

+0

たぶん単純な三角形を描くのはあなたの他の "オブジェクト"だったはずです。それからあなたは知っているでしょう。 – tauran

答えて

5
&vertex 

頂点はベクトルです。そのアドレスを取っても、データへのポインタは得られません。

編集の追加: 右。

  1. あなたはどんなのGL *ポインタコールを呼び出すことはありません:あなたは、少なくとも2つの以上の問題を持っているので、それはまだ、動作しません。 GLはあなたの頂点バッファオブジェクトから引き出す必要があるものを知らないでしょう
  2. 頂点配列に入れた頂点データは同じ頂点の3倍です。同じ場所にある3点の三角形:

    for(int i = 0; i < 9; i ++) myVBO [0] .vertex.push_back((i%3)*。2); //任意の頂点値

すべて同じ位置に3つの(.0.2 .4)ベクトルを作成します。

+1

する必要があります: '&vertex [0]' – tauran

+0

ああ笑はい、どこかで私はそれを知っていた!キャッチと改訂に感謝します。まだ空白のウィンドウが表示されます。 =/ –

+0

@Garet:追加データを参照してください。 – Bahbar

1

。バインドされたVAOを切り替えた後など、OpenGLバインディングの状態が変わる可能性がありますが、VBOクラスのインスタンスは引き続きアクティブであると考えます。 iBoundを完全にドロップし、オブジェクトが必要になるたびに再バインドしてください。最新のドライバでは、すでにバインドされたオブジェクトを再バインドすることは、ほとんど無料です。

+0

クライアントサイドの最適化にはこれが本当に役に立たないですか?私はクライアント/サーバー間でページングをセットアップする時が来たときに大抵は役に立つと思っていましたが、本当に便利だと思いました。 –

関連する問題