2013-03-08 113 views
0

我一直試圖呈現QGLWidget中的多維數據集,但它出錯了。不管我如何旋轉它,它看起來像一個平坦的廣場。就像它沒有注意到其頂點的Z座標。就在我加入GL_DEPTH_BUFFER_BIT清除之前,正方形看起來就像立方體的所有邊都塞進了一個。現在它似乎放棄了不屬於前面的頂點,但它仍然不是一個立方體。立方體呈現爲QGLWidget中的正方形

Screenshots [link]

我initializeGL()和paintGL():

typedef struct 
{ 
    float XYZW[4]; 
    float RGBA[4]; 
} Vertex; 

Vertex Vertices[8] = 
{ 
    //vertices 
}; 

const GLubyte Indices[36] = 
{ 
    //indices 
}; 

void ModelView::initializeGL() 
{ 
    m_program = new QGLShaderProgram(this); 
    m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexShaderSource); 

    m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentShaderSource); 

    m_program->link(); 
} 

void ModelView::paintGL() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    glClearColor(.5f, .5f, .5f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(0, 0, width(), height()); 

    m_program->bind(); 

    QMatrix4x4 matrix; 
    matrix.perspective(60, 4.0/3.0, 0.1, 100.0); 
    matrix.translate(0, 0, -2); 
    matrix.rotate(50.0, 1, 1, 1); 

    m_program->setUniformValue(m_matrixUniform, matrix); 

    m_posAttr = m_program->attributeLocation("posAttr"); 
    m_colAttr = m_program->attributeLocation("colAttr"); 
    m_matrixUniform = m_program->uniformLocation("matrix"); 

    glGenBuffers(1, &BufferId); 
    glGenBuffers(1, &IndexBufferId); 

    glBindBuffer(GL_ARRAY_BUFFER, BufferId); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId); 

    glBufferData(GL_ARRAY_BUFFER, BufferSize, Vertices, GL_STATIC_DRAW); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

    glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, VertexSize, 0); 
    glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, VertexSize, (GLvoid *)RgbOffset); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, NULL); 

    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    m_program->release(); 
} 

頂點和索引應正確定義,他們是從一個教程拍攝,因爲是大部分的代碼。儘管如此,2D對象的渲染看起來很好。

此外,爲什麼本教程使用-2參數調用matrix.translate?如果我將其更改爲大於1的任何其他值或將其刪除,則呈現的對象將消失。

Qt5,Windows Vista 32-bit。

回答

2

glVertexAttribPointer()有一個size參數,它指定每個頂點的組件數量。在代碼中它是2,因此一切都是2D。改爲3解決了這個問題。

2

此外,爲什麼教程調用matrix.translate與-2 參數?如果我將其更改爲大於1的任何其他值或將其刪除,則 呈現的對象將消失。

這是由於剪切。在渲染對象時,通過近和遠裁剪平面(分別)丟棄「太接近」或「太遠」的事物。

通過將立方體移近(將-2更改爲1或0),您可以將立方體向前移動,經過近剪裁平面,從而消失。

+0

謝謝,沒有想到這一點。 – 2013-03-08 11:06:55

+0

很高興有幫助。 upvote不會傷害:) – 2013-03-08 11:29:21