2012-10-28 3 views
2

OpenGL과 Qt로 삼각형을 표시하려고하는데 검정색 창만 나타납니다. 내가 뭘 잘못하고 있니?Qt와 OpenGL로 삼각형을 표시합니다.

glwidget.h :

#pragma once 
#include <QGLWidget> 

class GLWidget : public QGLWidget { 
public: 
    GLWidget(QWidget *parent = 0); 
    ~GLWidget(); 
    QSize sizeHint() const { return QSize(400, 400); } 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 
}; 

glwidget.cpp :

#include "glwidget.h" 

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) {} 

GLWidget::~GLWidget(){ } 

void GLWidget::initializeGL() { } 

void GLWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(-1.5f,0.0f,-6.0f); 

    glBegin(GL_TRIANGLES); 
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glVertex3f(-1.0f,-1.0f, 0.0f); 
    glVertex3f(1.0f,-1.0f, 0.0f); 
    glEnd(); 
} 

void GLWidget::resizeGL(int w, int h) 
{ 
    QGLWidget::resize(w,h); 
} 

MAIN.CPP : 당신은 paintGL의 시작 부분에 뷰포트 및 프로젝션을 설정해야합니다

#include <QApplication> 
#include "glwidget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    GLWidget glWidget; 
    glWidget.show(); 
    return app.exec(); 
} 

답변

5

멤버 함수. 페인트 시작 부분에 이것을 넣으십시오. GL :

QSize viewport_size = size(); 
glViewport(0, 0, viewport_size.width(), viewport_size.height()); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(-1, 1, -1, 1, 5, 7); // near and far match your triangle Z distance 

glMatrixMode(GL_MODELVIEW); 

또한 창이 이중 버퍼링 된 경우 그리기 후에 버퍼를 교환해야합니다. 하나는 paintGL 돌아 오면 교환, 또는 paintGL의 말에

swapBuffers(); 

을 추가, 생성자에서

setAutoBufferSwap(true); 

을 설정합니다.

+0

감사 datenwolf을 변환합니다! 내가 이해하지 못하는 한 가지. glFrustum은 카메라 (z = 0)에서 5 (가까운)에서 7 (먼)까지의 거리를가집니다. 그러나 내 삼각형은 z = -6에 있습니다!? 내 삼각형은 z = 6에 있어야한다고 생각하거나 화면에 OpenGL의 음수 z 의미의 규칙이 있습니까? – Andy

+0

@Andy : OpenGL의 기본 규칙은 깊이 범위가 [0 ... 1]이고 GL_GREATER 심도 정렬입니다. glFrustum은 음의 Z 방향으로 음의 깊이 값으로 좌표를 매핑합니다. 사실 이것은 기본 OpenGL 설정이 음수 Z 값을 화면에 매핑한다는 것을 의미합니다. 그러므로 glFrustum의 near와 far 값은 음의 Z 방향으로의 거리를 의미합니다. – datenwolf

+0

@datenwolf : 아니요, 기본 깊이 테스트는 'GL_LESS'를 사용합니다. Z가 음수 인 이유는 그것이 OpenGL의 원근감 행렬이 작동하는 방식이기 때문입니다. -Z가 카메라 앞에 있고, + Z가 뒤에 있습니다. zNear 및 zFar는 카메라 공간 값이 아닌 거리 (따라서 항상 양수)입니다. –

-1

삼각형 형태를

glTranslatef(-0.5f,0.0f, 0.0f); 

glColor3f(1.0f, 0.0f, 0.0f); 
glBegin(GL_TRIANGLES); 
glVertex3f(0.0f, 0.2f, 0.0f); 
glVertex3f(-0.2f,-0.2f, 0.0f); 
glVertex3f(0.2f,-0.2f, 0.0f); 
glEnd();