2014-02-28 2 views
0

저는 Qt에서 쉐이더 및 간단한 버텍스 배열을 사용하여 OpenGL을 사용하려고했습니다. 기본적으로 화면 중간에 그려지는 평야를 원하지만 프로그램을 실행할 때 아무 것도 나타나지 않습니다. 나는 Qt의 "Texture"예제에서 내 코드를 기반으로하고 있습니다. 모든 것이 나에게 똑같아 보이지만 작동하지 않습니다!OpenGL + Qt 4.8은 무언가를 그리지 않습니다

attribute highp vec4 vertices; 
attribute highp mat4x4 modelmatrix; 

void main (void) 
{ 
gl_Position= modelmatrix*vertices; 
} 

그리고 내 fShader :

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

당신이 오류를 보입니까

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent):QGLWidget(parent) 
{ 
    timer.start(10); 
    //connect(&timer, SIGNAL(timeout()), this, SLOT(updateGL())); 

    Object aux; 

    QVector3D auxV; 
    auxV.setX(0.4); auxV.setY(0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    auxV.setX(-0.4); auxV.setY(-0.4); auxV.setZ(1.0); 
    aux.vertices.append(auxV); 

    Objects.append(aux); 
} 

GLWidget::~GLWidget() 
{ 
} 

void GLWidget::initializeGL() 
{ 
    #define PROGRAM_VERTEX_ATTRIBUTE 0 

    printf("Objects Size: %d\nObj1 Size: %d\n", Objects.size(), Objects.at(0).vertices.size()); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_CULL_FACE); 

    //printf("Version: %s\n", glGetString(GL_VERSION)); 

    vShader= new QGLShader (QGLShader::Vertex, this); 
    vShader->compileSourceFile("../src/shaders/editorVshader.glsl"); 

    fShader= new QGLShader (QGLShader::Fragment, this); 
    fShader->compileSourceFile("../src/shaders/editorFshader.glsl"); 

    editor= new QGLShaderProgram (this); 
    editor->addShader(vShader); 
    editor->addShader(fShader); 
    editor->bindAttributeLocation("vertices", PROGRAM_VERTEX_ATTRIBUTE); 
    editor->link(); 
    editor->bind(); 
} 

void GLWidget::paintGL() 
{ 
    glClearColor(0.4765625, 0.54296875, 0.6171875, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    glTranslatef(0.0f, 0.0f, -10.0f); 

    glVertexPointer(3, GL_FLOAT, 0, Objects.at(0).vertices.constData()); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    QMatrix4x4 auxM; 
    auxM.ortho(-0.5, 0.5, 0.5, -0.5, 4.0, -15.0); 
    auxM.translate(0.0f, 0.0f, -10.0f); 
    editor->setUniformValue("modelmatrix", auxM); 

    editor->enableAttributeArray(PROGRAM_VERTEX_ATTRIBUTE); 

    //editor->enableAttributeArray(editor->attributeLocation("vertices")); 
    //editor->setAttributeArray(editor->attributeLocation("vertices"), Objects.at(0).vertices.constData(), 3); 

    editor->setAttributeArray (PROGRAM_VERTEX_ATTRIBUTE, Objects.at(0).vertices.constData()); 
    glDrawArrays(GL_QUADS, 0, 4); 
} 

void GLWidget::resizeGL(int w, int h) 
{ 
    int side = qMin(w, h); 
    glViewport((w - side)/2, (h - side)/2, side, side); 

    //glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-0.5, 0.5, -0.5, 0.5, 4.0, -15.0); 
    glMatrixMode(GL_MODELVIEW); 
    updateGL(); 
} 

그리고 여기 내 vShader 있습니다 : 여기

내 glwidget.cpp의 코드입니다 그곳에?

+0

쉐이더가 완전히 혼란 스럽습니다. GLSL 1.10에서는'highp' 정밀도 한정자를 사용할 수 없으며, 마찬가지로'mat4x4'는 1.10에 존재하지 않습니다. 최소한 #version 120을 포함시켜야합니다. OpenGL ES 쉐이더와 데스크탑 GL을 섞어서 일치 시키려고 했습니까? –

+0

맞습니다. mat4x4가 잘못되었습니다. 나는 그것을 바꿨다. 하지만 본질적으로 예제와 같은 쉐이더를 사용하고 있습니다. #version을 사용하지도 않습니다. (Qt의 다른 프로그램에서도 사용 했었습니다.) 그들은 작동합니다. – BlastDV

+0

다른 주목해야 할 것은 modelmatrix가 속성이 아닌 균일 한 값으로 전달된다는 것입니다. 그것은 변경되었지만 여전히 작동하지 않습니다. – BlastDV

답변

1

OpenGLES1.1 (예 : glOrtho, glTranslate) 및 2.0 (쉐이더 사용)을 혼합합니다. 텍스쳐를 혼합하고 + ​​예제를 오버 페인트하고 있습니까? 대신 OpenGL/ES/1.1 또는 2.0 (예 : http://qt-project.org/doc/qt-5.0/qtopengl/textures.html)을 사용하는 한 가지 예를 취한 다음 변경하고 코드 작동 방식을 확인해야합니다.

0

문제점이 무엇인지 발견했습니다.

당신이 맞아요, prabindh, 내가 OpenGL 버전을 섞어서, 그 문제가 관련이 있습니다. OpenGL ES 지침에서 코드를 삭제 한 후에 모델, 뷰 및 프로젝션 행렬을 추가하여 셰이더로 전달했습니다. 그것은 효과가있다! 실제로 나는 비행기가 항상 거기에 있었다고 생각한다. 그러나 카메라가 "다른 곳을 목표로하고 있었기 때문에 나는 그것을 볼 수 없었다."

그러나 예제를 혼합하지 않았으므로 텍스쳐 예제에서 모든 코드를 기반으로했습니다. 여전히 코드가 작동하는 이유와 이해하지 못했습니다. 하지만 어쨌든 모든 것이 끝나 버렸습니다.

답장 및 의견을 보내 주셔서 감사합니다.