Macos OpenGL在Qt(而不是GLUT)上出现问题

Macos OpenGL在Qt(而不是GLUT)上出现问题,macos,qt,opengl,Macos,Qt,Opengl,我尝试了一些简单的(和旧的)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 该计划主要是相同的,

我尝试了一些简单的(和旧的)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();
}
#包括“glwidget.h”
#包括
#包括
GLWidget::GLWidget(QWidget*父项):
QGLWidget(父级)
{
QTimer*t=新的QTimer(本);
连接(t,信号(超时()),此,插槽(更新());
t->启动(1000.0f/30.0f);//每秒30帧
}
void GLWidget::initializeGL()
{
glShadeModel(GL_平滑);
glClearColor(1,1,1,0);
GLC清除深度(1);
glEnable(GLU深度试验);
glMatrixMode(GLU模型视图);
//glHint(GL\u透视图\u校正\u提示,GL\u最佳);
//glEnable(GL_线_光滑);
//glEnable(GL_POINT_SMOOTH);
glLoadIdentity();
glEnable(GL_纹理_2D);
glGenTextures(1和纹理标识);
glBindTexture(GL_纹理_2D,纹理_id);
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,大小,大小,0,GL_RGB,
GL_无符号字节,纹理);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理_2D、GL_纹理_包裹、GL_夹具);
glTexParameteri(GL_纹理2D、GL_纹理包裹、GL_夹具);
}
void GLWidget::resizeGL(int w,int h)
{
h=h?h:1;
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(45.0f,(GLfloat)w/(GLfloat)h,0.18000.0f);
glMatrixMode(GLU模型视图);
}
浮动旋转=20;
void GLWidget::paintGL()
{
makeCurrent();
//glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
//glLoadIdentity();
glLoadIdentity();
glTranslatef(0,0,-10);
glRotatef(旋转,1,0,0);
glRotatef(20,0,1,0);
/*定义适合纹理的视口*/
glMatrixMode(GL_投影);
glLoadIdentity();
(20,1,5,15);
glViewport(0,0,大小,大小);
glMatrixMode(GLU模型视图);
/*渲染到缓冲区*/
glClearColor(1,1,1,0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
立方体();
glFlush();
/*将缓冲区复制到纹理*/
glCopyTexSubImage2D(GL_纹理_2D,0,5,5,0,0,大小-10,大小-10);
/*渲染到屏幕*/
glMatrixMode(GL_投影);
glLoadIdentity();
(20,宽度()/(浮动)高度(),5,15);
glViewport(0,0,width(),height());
glMatrixMode(GLU模型视图);
glClearColor(0,0,0,0);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
立方体();
/*结束*/
glFlush();
/*不断更新*/
旋转+=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);
格伦德();
}

另外,Ubuntu 12.04下的同一个Qt程序没有问题

我确实在你在另一个问题中发布的代码中看到了这一点:

两边都有10个像素的边界未定义。在该演示中,它是为了给纹理添加一些边界,但从技术上讲,它将保留纹理中已经存在的任何内容不变


现在,由于您可能正在使用一些未定义的数组数据初始化纹理(我没有看到
纹理
作为数据参数传递给GLTEXAGE2D进行初始化),这将创建一些垃圾。顺便说一句:通过将空指针传递给GLTEXAGE2D的数据参数,您可以安全地初始化纹理。

@datenwold:谢谢。所以我尝试过:1)我尝试设置
*texture=0
以在
glTexImage2D之前传递空指针(GL\u texture\u 2D,0,GL\u RGB,SIZE,SIZE,0,GL\u RGB,GL\u UNSIGNED\u BYTE,texture)。。没有任何更改2)
(int i=0;i@nkint:传递0指针会使纹理未初始化,这也可能导致垃圾。关于后者:如何定义和初始化
*纹理
?它必须使用
new
静态分配,必须是
std::vector
QVector
。我忘了用new初始化它。is was
无符号整数纹理[3*SIZE*SIZE];
现在是
无符号整数*纹理;…纹理=新的无符号整数[3*SIZE*SIZE];
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 5, 5, 0, 0, SIZE - 10, SIZE - 10);
                                                       ^^^^       ^^^^