2015-04-02 65 views
0

在較早的GLSL版本上繪製一個常規的VBO不是問題,但無論什麼原因,當使用GLSL 3.3時我會得到這個結果。從VBO/Shader/MVP矩陣使用OpenGL 3.3亂碼三角形

它應該在每個軸上繪製一個2x2平面。

(較淺的顏色更接近遠平面,顏色較深的更接近近平面) Picture of problem

其中一個重大變化3.3是,你必須提供與您的模型視圖投影矩陣的制服,而不是使用舊的提供的。

我不知道我在做什麼錯,但我幾乎可以肯定這是與模型視圖投影數據有關。這是相關的代碼。

主拉制法

float r = 0.0f; 
void display() { 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque 
    glClear(GL_COLOR_BUFFER_BIT);   // Clear the color buffer 
    glClear(GL_DEPTH_BUFFER_BIT);   // And the depth buffer 

    r += 0.001f; 

    glUseProgram(program); 
    glEnable(GL_DEPTH_TEST); 

    GLuint uniformModel = glGetUniformLocation(program, "model"); 
    GLuint uniformView = glGetUniformLocation(program, "view"); 
    GLuint uniformProjection = glGetUniformLocation(program, "projection"); 

    glm::mat4 projection = glm::perspective(70.0f, 1.0f, 0.0f, 16.0f); 
    glUniformMatrix4fv(uniformProjection, 1, GL_FALSE, glm::value_ptr(projection)); 

    glm::vec3 eye = glm::vec3(sin(r*0.33)*5.0f,5,cos(r*0.33)*5.0f); 
    glm::vec3 center = glm::vec3(0.0f,0.0f,0.0f); 
    glm::vec3 up = glm::vec3(0.0f,0.0f,1.0f); 

    glm::mat4 view = glm::lookAt(eye, center, up); 
    glUniformMatrix4fv(uniformView, 1, GL_FALSE, glm::value_ptr(view)); 

    glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f,0.0f,0.0f)); 

    glUniformMatrix4fv(uniformModel, 1, GL_FALSE, glm::value_ptr(model)); 


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

    glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_INT, indices); 

    glDisableVertexAttribArray(0); 

    glDisable(GL_DEPTH_TEST); 
    glUseProgram(0); 

    glFlush(); // Render now 
} 

頂點/指數陣列&着色

string vert 
     = "#version 330 core\n" 
     "layout(location = 0) in vec3 vertex;\n" 
     "uniform mat4 model;\n" 
     "uniform mat4 view;\n" 
     "uniform mat4 projection;\n" 
     "void main(){\n" 
     " gl_Position = projection * view * model * vec4(vertex,1.0f);\n" 
     "}"; 
string frag 
     = "#version 330 core\n" 
     "out vec3 color;\n" 
     "void main()\n" 
     "{\n" 
     " float lin = 1.0/gl_FragCoord.w;\n" 
     " float depth = (lin - 0.1)/(16.0 - 0.1);\n" 
     " color = vec3(depth,depth,1.0f);\n" 
     "}"; 

float* data = new float[36] { 
    -1.0f,-1.0f,0.0f, 
    1.0f,-1.0f,0.0f, 
    1.0f,1.0f,0.0f, 
    -1.0f,1.0f,0.0f, 
    0.0f,-1.0f,-1.0f, 
    0.0f,1.0f,-1.0f, 
    0.0f,1.0f,1.0f, 
    0.0f,-1.0f,1.0f, 
    -1.0f,0.0f,-1.0f, 
    1.0f,0.0f,-1.0f, 
    1.0f,0.0f,1.0f, 
    -1.0f,0.0f,1.0f 
}; 

GLuint* indices = new GLuint[18] { 
    0,1,2, 
    0,3,2, 
    4,5,6, 
    4,7,6, 
    8,9,10, 
    8,11,10 
}; 

初始化

const int winSize = 1024; 
void glInit(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutInitContextVersion(3,3); 
    //glutInitContextFlags(GLUT_CORE_PROFILE | GLUT_DEBUG); 
    glutInitWindowSize(winSize, winSize); 
    glutInitWindowPosition(25, 25); 
    glutCreateWindow("Loading..."); 
    glewExperimental = GL_TRUE; 
    glewInit(); 
    glViewport (0, 0, winSize, winSize); 
    camera.setPosition(0.0f,0.0f,4.0f); 

    glGenVertexArrays(1, &vba); 
    glBindVertexArray(vba); 

    program = compileShader(vert, frag); 

    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, 3*4*3*4, data, GL_STATIC_DRAW);  


    glEnable(GL_DEPTH_TEST); 
    while(!bExit) { 
     string pre; 
     pre.assign("Test Program - "); 
     pre.append(std::to_string(fps)); 
     glutSetWindowTitle(pre.c_str()); 
     frames++; 
     display(); 
    } 
} 
+1

不確定這是否是您的問題,但在投影矩陣中將近平面設置爲0.0通常不是好主意。遠/近不應該太大,以確保合理的深度精度。並且在0.0附近使遠/近無窮。 – 2015-04-03 02:59:23

+0

將其更改爲0.1,但混亂仍然存在。至少對未來的項目來說這是一些有用的建議:P謝謝。 – 2015-04-03 14:24:15

+0

這些指數看起來對我來說很可疑。例如,「{0,1,2}」具有與「{0,3,2}」不同的順序。如果第一個是CCW,那麼後者是CW。 – 2015-04-04 08:32:09

回答

0

原來我是個白癡,這只是一種錯誤的錯誤。

我在init方法中定義了GLuint vbo,並且也在程序範圍內,但vbo的實際值只能放入局部變量中。 display()完全不具有vbo的可見性。

GLuint vbo; 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

它總是引起荒謬的錯誤的小事情。 < _>