2011-02-04 39 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,并在每次需要对象时重新绑定。现代司机重新绑定一个已经绑定的对象几乎是免费的。