2011-02-04 36 views
3

編輯II:
當前代碼很好用!感謝大家。我繼續前進,並在底部包含了我的着色器代碼以供參考,儘管在這一點上它們完全沒有任何作用。代碼輔助,OpenGL VAO/VBO類沒有繪製

我想起牀和去與OpenGL 4.1,我仍然很早開發。目前我甚至沒有真正在這個項目中使用4.0功能,所以這同樣也是OpenGL 3的問題。

我最初的工作目標是簡單地制定兩個類來處理VAO和VBO。我有一些誤解,但終於擺脫了空白屏幕。

/* 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。我完全拋棄了一些東西,還是隻需要糾正一些東西?代碼現在有點受損,對不起。

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 2011-02-04 14:18:43

+0

絕對沒有線索,所以可能不會,當我得到一個好的休息時,我會考慮它,thx。 – 2011-02-04 14:26:51

+0

也許只是繪製一個簡單的三角形是你的其他「對象」應該是。然後你就會知道。 – tauran 2011-02-04 14:30:43

回答

5
&vertex 

頂點是一個向量。拿它的地址不會給你一個指向數據的指針。

修改添加: 沒錯。它仍然不起作用,因爲您至少有兩個問題:

  1. 您不調用任何gl *指針調用。在GL不會知道它需要從你的頂點緩衝對象拉
  2. ,你把你的頂點數組的頂點數據是相同的頂點3倍。在同一位置使用3個點的三角形:

    for(int i = 0; i < 9; i ++) myVBO [0] .pubush_back((i%3)*。2); //任意頂點值

它創建3個(.0.2.4)矢量,全部在相同的位置。

1

這VBO的iBound成員看起來可疑。例如,在切換綁定的VAO之後,OpenGL綁定狀態可能會發生變化,但VBO類實例仍然認爲它是活動的。只需完全放下iBound,並在每次需要對象時重新綁定。現代司機重新綁定一個已經綁定的對象幾乎是免費的。