2014-02-23 58 views
1

我下面this tutorial了一些修改,並已得到這個代碼:的OpenGL不會呈現三角

#define GLSL(src) "#version 330 core\n" #src 

void MainWindow::initializeGL() { 

    glClearColor(0, 0, 0, 1); 

    // Generate buffers 

    GLfloat verticies[] = { 
     +0.0f, +1.0f, +0.0f, 

     -1.0f, -1.0f, +0.0f, 

     +1.0f, -1.0f, +0.0f, 
    }; 

    GLuint vertexBufferID; 
    glGenBuffers(1, &vertexBufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); 

    // Generate shaders 

    const char *vertexShaderSrc = GLSL(
     layout(location = 0) in vec3 pos; 

     void main() { 
      gl_Position.xyz = pos; 
      gl_Position.w = 1.0; 
     } 
    ); 


    GLuint vertexShaderID = createGLShader(GL_VERTEX_SHADER, vertexShaderSrc); 

    const GLchar *fragmentShaderSrc = GLSL(
     out vec4 color; 

     void main() { 
      color = vec4(0.0, 1.0, 0.0, 1.0); 
     } 
    ); 

    GLuint fragmentShaderID = createGLShader(GL_FRAGMENT_SHADER, fragmentShaderSrc); 

    GLuint programID = glCreateProgram(); 
    glAttachShader(programID, vertexShaderID); 
    glAttachShader(programID, fragmentShaderID); 
    glLinkProgram(programID); 
    glUseProgram(programID); 
} 

void MainWindow::paintGL() { 
    //glViewport(0, 0, width(), height()); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 
    //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
} 

GLuint MainWindow::createGLShader(GLenum type, const GLchar* src) { 
    GLuint shaderID = glCreateShader(type); 
    glShaderSource(shaderID, 1, &src, 0); 
    glCompileShader(shaderID); 
    GLint vertexCompileStatus; 
    glGetShaderiv(shaderID, GL_COMPILE_STATUS, &vertexCompileStatus); 
    if (vertexCompileStatus != GL_TRUE) { 
     GLint infoLogLength; 
     glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &infoLogLength); 
     GLchar buffer[infoLogLength]; 
     glGetShaderInfoLog(shaderID, infoLogLength, 0, buffer); 
     qDebug(buffer); 
    } 
    return shaderID; 
} 

這是所有包含在QGLWidget。但是,當我運行這個代碼時,我只是得到一個黑屏。出了什麼問題?我沒有收到錯誤消息,所以着色器正在編譯。

我成立了QGLWidget

#include "mainwindow.h" 
#include <QApplication> 
#include <QGLFormat> 

int main(int argc, char *argv[]) { 
    QApplication a(argc, argv); 

    QGLFormat glFormat; 
    glFormat.setVersion(3, 3); 
    glFormat.setProfile(QGLFormat::CoreProfile); 

    MainWindow w(glFormat); 
    w.show(); 

    return a.exec(); 
} 
+0

@huseyintugrulbuyukisik感謝您的建議,但沒有區別。 – carloabelli

+0

@huseyintugrulbuyukisik爲什麼代碼在教程中工作呢? – carloabelli

+0

Im sory我誤解爲C++。你能給一個鏈接教程嗎? –

回答

1

與 「純」 的OpenGL代碼,你需要(至少)一個頂點數組對象入住。在配置頂點數組時,每次從上述數組中繪製時,都需要綁定該對象。

因此,在撥打gl*VertexAttribArray之前,請創建並綁定VAO。添加一個

GLuint m_vao; 

成員到您的班級。然後在​​:

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

// now configure the arrays: 
glEnableVertexAttribArray... 
glVertexAttribArray... 

// now release the VAO and move on 
glBindVertexArray(0); 

然後在paintGL,我們再次需要VAO:

glBindVertexArray(m_vao); 
glDrawArrays(...); 
glBindVertexArray(0); 

而且現在Qt 5 OpenGL enablers你的代碼(沒有嘗試編譯它,但你可以得到的理念)。你告訴我哪一個更可讀,更不容易出錯。

#define GLSL(src) "#version 330 core\n" #src 

void MainWindow::initializeGL() { 

    glClearColor(0, 0, 0, 1); 

    // Generate buffers 

    GLfloat verticies[] = { 
     +0.0f, +1.0f, +0.0f, 

     -1.0f, -1.0f, +0.0f, 

     +1.0f, -1.0f, +0.0f, 
    }; 

    m_vertexBuffer = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer); 
    m_vertexBuffer->create(); 
    m_vertexBuffer->setusagePatter(QOpenGLBuffer::StaticDraw); 
    m_vertexBuffer->bind(); 
    m_vertexBuffer->allocate(verticies, sizeof(verticies); 
    m_vertexBuffer->release(); 

    // Generate shaders 

    const char *vertexShaderSrc = GLSL(
     layout(location = 0) in vec3 pos; 

     void main() { 
      gl_Position.xyz = pos; 
      gl_Position.w = 1.0; 
     } 
    ); 

    const GLchar *fragmentShaderSrc = GLSL(
     out vec4 color; 

     void main() { 
      color = vec4(0.0, 1.0, 0.0, 1.0); 
     } 
    ); 

    m_program = new QOpenGLShaderProgram; 
    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSrc);  
    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSrc); 
    m_program->link(); 
    // error checking missing from the last three calls. if they return false, check log() 

    m_vao = new QOpenGLVertexArrayObject; 
    m_vao->bind(); 
    m_program->bind(); 

    m_vertexBuffer->bind(); 
    m_program->enableAttributeArray("pos"); 
    m_program->setAttributeBuffer("pos", GL_FLOAT, 0, 3); 
    m_vertexBuffer->release(); 

    m_program->release(); 
    m_vao->release(); 
} 

void MainWindow::paintGL() {  
    glClear(GL_COLOR_BUFFER_BIT); 

    m_vao->bind(); 
    m_program->bind(); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    m_program->release(); 
    m_vao->release(); 
} 
+0

感謝您的代碼示例。我找到了它來修復一些拼寫錯誤,但我仍然得到一個黑屏。 – carloabelli

+0

跟我一樣... – steventaitinger