簡體   English   中英

使用Qt的OpenGL故障(而不是GLUT)

[英]OpenGL glitch with Qt (and not with GLUT)

我在這個網站上嘗試了一些簡單(和舊)的opengl教程。 在gcc中編譯它們很好。 現在我已經嘗試將它們放在我真正需要的地方:在QGLWidget中的Qt應用程序中。 並且..我有一些小故障(彩色像素,圖像應該全黑和白色)。 不知道為什么。

見附圖:

在此輸入圖像描述

我在Mac OS / X 10.8,Qt 4.8和QtCreator,我正在編譯基本的GLUT教程:

gcc -o test -Wall -W test.c -framework GLUT -framework OpenGL

該程序主要是相同的,一部分來自替換一些GLUT與Qt ..無論如何,這里是cpp文件:

#include "glwidget.h"

#include <QTimer>
#include <iostream>

GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(parent)
{
    QTimer *t = new QTimer(this);
    connect(t, SIGNAL(timeout()), this, SLOT(update()));
    t->start(1000.0f/30.0f); // 30 FPS
}

void GLWidget::initializeGL()
{
    glShadeModel(GL_SMOOTH);

    glClearColor(1, 1, 1, 0);

    glClearDepth(1);
    glEnable(GL_DEPTH_TEST);

    glMatrixMode(GL_MODELVIEW);

    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    //glEnable(GL_LINE_SMOOTH);
    //glEnable(GL_POINT_SMOOTH);

    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture_id);
    glBindTexture(GL_TEXTURE_2D, texture_id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SIZE, SIZE, 0, GL_RGB,
                 GL_UNSIGNED_BYTE, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

}

void GLWidget::resizeGL(int w, int h)
{
    h = h ? h : 1;

    glViewport(0, 0, w,h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)w/(GLfloat)h, 0.1, 8000.0f);
    glMatrixMode(GL_MODELVIEW);
}

float rotation=20;
void GLWidget::paintGL()
{
    makeCurrent();

    //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    //glLoadIdentity();

    glLoadIdentity();
    glTranslatef(0, 0, -10);
    glRotatef(rotation, 1, 0, 0);
    glRotatef(20   , 0, 1, 0);

    /* Define a view-port adapted to the texture */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(20, 1, 5, 15);
    glViewport(0, 0, SIZE, SIZE);
    glMatrixMode(GL_MODELVIEW);

    /* Render to buffer */
    glClearColor(1, 1, 1, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Cube();
    glFlush();

    /* Copy buffer to texture */
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 5, 5, 0, 0, SIZE - 10, SIZE - 10);

    /* Render to screen */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(20, width() / (float) height(), 5, 15);
    glViewport(0, 0, width(), height());
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Cube();

    /* End */
    glFlush();

    /* Update again and again */
    rotation += 0.1;
}

void GLWidget::Cube()
{
    glBegin(GL_QUADS);

    glTexCoord2i(0, 0); glVertex3f(-1, -1, -1);
    glTexCoord2i(0, 1); glVertex3f(-1, -1,  1);
    glTexCoord2i(1, 1); glVertex3f(-1,  1,  1);
    glTexCoord2i(1, 0); glVertex3f(-1,  1, -1);

    glTexCoord2i(0, 0); glVertex3f( 1, -1, -1);
    glTexCoord2i(0, 1); glVertex3f( 1, -1,  1);
    glTexCoord2i(1, 1); glVertex3f( 1,  1,  1);
    glTexCoord2i(1, 0); glVertex3f( 1,  1, -1);

    glTexCoord2i(0, 0); glVertex3f(-1, -1, -1);
    glTexCoord2i(0, 1); glVertex3f(-1, -1,  1);
    glTexCoord2i(1, 1); glVertex3f( 1, -1,  1);
    glTexCoord2i(1, 0); glVertex3f( 1, -1, -1);

    glTexCoord2i(0, 0); glVertex3f(-1,  1, -1);
    glTexCoord2i(0, 1); glVertex3f(-1,  1,  1);
    glTexCoord2i(1, 1); glVertex3f( 1,  1,  1);
    glTexCoord2i(1, 0); glVertex3f( 1,  1, -1);

    glTexCoord2i(0, 0); glVertex3f(-1, -1, -1);
    glTexCoord2i(0, 1); glVertex3f(-1,  1, -1);
    glTexCoord2i(1, 1); glVertex3f( 1,  1, -1);
    glTexCoord2i(1, 0); glVertex3f( 1, -1, -1);

    glTexCoord2i(0, 0); glVertex3f(-1, -1,  1);
    glTexCoord2i(0, 1); glVertex3f(-1,  1,  1);
    glTexCoord2i(1, 1); glVertex3f( 1,  1,  1);
    glTexCoord2i(1, 0); glVertex3f( 1, -1,  1);

    glEnd();
}

PS。 Ubuntu 12.04下的同一Qt程序沒問題

我確實已經在您在其他問題中發布的代碼中看到了這一點:

 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 5, 5, 0, 0, SIZE - 10, SIZE - 10); ^^^^ ^^^^ 

兩邊都有一個10像素的邊框未定義。 在那個演示中,它完成了給紋理一些邊框,但從技術上講,它會保留紋理中已經存在的任何東西。

現在,因為您可能使用一些未定義的數組數據初始化紋理(我沒有看到texture作為數據參數傳遞給glTexImage2D進行初始化),這將產生一些垃圾。 順便說一句:您可以通過將空指針傳遞給glTexImage2D的數據參數來安全地初始化紋理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM