2017-06-29 156 views
2

我學Qt中使用OpenGL與QOpenGLFramebufferObject,並嘗試使用下面的代碼來繪製三角形:Qt的幀緩衝區對象不渲染,甚至頂點

render()

glUseProgram(m_program); 
GLfloat vertices[] = { 
    -1.0f, -1.0f, // first 
    0.0f, -1.0f, // second 
    0.0f, 1.0f // third 
}; 
unsigned int VAO; 
glGenVertexArrays(1, &VAO); 
glBindVertexArray(VAO); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), vertices); 
glBindVertexArray(0); 
glDisable(GL_DEPTH_TEST); 
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
glBindVertexArray(VAO); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

而着色器是initShader()

const GLchar* vfSource[] = { 
    "#version 330 core\n" 
    "layout (location = 0) in vec2 aPos;\n" 
    "void main()\n" 
    "{\n" 
    " gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0);\n" 
    "}\n\0" 
}; 
const GLchar* fsSource[] = { 
    "#version 330 core\n" 
    "out vec4 FragColor;\n" 
    "void main()\n" 
    "{\n" 
    " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" 
    "}\n\0" 
}; 

只有正確地呈現第一和第三頂點。第二個頂點位於我的屏幕中央。

如果我改變了vertices[]

-1.0f, -1.0f, // 1 
0.0f, -1.0f, // 2 
0.0f, 1.0f // 3 
1.0f, 1.0f, // 4 
1.0f, 0.0f // 5 

和最後一行

glDrawArrays(GL_TRIANGLES, 0, 5); 

的輸出是由數據線中產生的三角形1 3和5

我不知道這段代碼有什麼問題。任何人都可以幫助我?

如果需要更多的代碼,請讓我知道。

回答

2

OpenGL 3.3 Core Profile(您的着色器所針對的)不允許您直接從客戶端內存中繪製。 glVertexAttribPointer的最後一個參數是當前綁定的GL_ARRAY_BUFFER的偏移量。如果沒有設置GL_ARRAY_BUFFER,則將其設置爲零以外的值應觸發GL_INVALID_OPERATION

爲了讓你的例子工作,你需要生成一個頂點緩衝區對象(VBO)並將其附加到VAO。

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

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0); 
glBindVertexArray(0); 
+0

已解決。非常感謝 :) –

相關問題