C++ 使用OpenGL和QT-C+进行纹理映射+;

C++ 使用OpenGL和QT-C+进行纹理映射+;,c++,qt,opengl,C++,Qt,Opengl,我无法使用OpenGL和Qt将纹理映射到四边形。我已经研究了其他几个SO线程,但在编译时,许多函数调用的使用方式必须略有不同(Qt Verison 4.8.6)。这是我的相关代码,现在只显示一个黑色背景的窗口,其他什么都没有 void LoadGLTextures( const char * name ) { QImage img; if(!img.load("resources/Green_Dragon.bmp")){ std::cerr << "

我无法使用OpenGL和Qt将纹理映射到四边形。我已经研究了其他几个SO线程,但在编译时,许多函数调用的使用方式必须略有不同(Qt Verison 4.8.6)。这是我的相关代码,现在只显示一个黑色背景的窗口,其他什么都没有

void LoadGLTextures( const char * name )
{
    QImage img;

    if(!img.load("resources/Green_Dragon.bmp")){
        std::cerr << "ERROR in loading image" << std::endl;
    }

    QImage t = QGLWidget::convertToGLFormat(img);

    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glBindTexture( GL_TEXTURE_2D, 0 );
}



void GLWidget::initializeGL()
{


    qglClearColor(qtBlack.dark());
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_MULTISAMPLE);
    static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    cameraPos = 0;
    glEnable(GL_TEXTURE_2D);
    LoadGLTextures("resources/Green_Dragon.jpeg");

}

void GLWidget::paintGL()
{
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
    glClear( GL_COLOR_BUFFER_BIT );


    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glShadeModel( GL_FLAT );
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glColor3f(0.5, 0.5, 0);
    glBindTexture(GL_TEXTURE_2D, texture[0]);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5f, 0.5f);  // vertex 1
    glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5f, -0.5f); // vertex 2
    glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, -0.5f); // vertex 3
    glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.5f); // vertex 4
    glEnd();
    glDisable(GL_TEXTURE_2D);

    glFlush();
}
void LoadGLTextures(const char*name)
{
QImage img;
如果(!img.load(“resources/Green\u Dragon.bmp”)){

std::cerr删除
glEnable(GLU深度测试)
为我解决了这个问题,以防有人遇到类似的问题。

查看您的评论,现在答案相当清楚,很抱歉我在问题评论中遗漏了它

您看到的是黑屏,因为您正在启用深度测试,但没有清除帧之间的深度缓冲区。因此,前一帧的深度缓冲区值保持不变,并且所有后续帧的深度测试都失败(请注意)

您可以保持启用深度测试。正确的解决方案是在每次渲染之前清除颜色缓冲区之外的深度缓冲区。您有:

glClear( GL_COLOR_BUFFER_BIT );
但你需要:

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

另请参见:

(请注意,您传递给
LoadGLTextures
的文件名将被忽略,不确定这是否是有意的。)你怎么知道文件名被忽略了?编辑:没关系,这是因为我没有使用我传递的变量,duh。我尝试了你的建议,但还没有解决问题,谢谢你的帮助。此外,我没有看到你在任何地方设置投影矩阵。默认情况下,GL将相机设置为(0,0,0)它面向-Z。要么设置相机投影,要么将四边形移动到Z<0的某个位置(虽然我不记得默认的剪辑平面距离)。我建议使用前者。查看
gluPerspective
(应用于
GluProjection
)和
gluLookAt
(应用于
GluModelView
以重新定位相机).
QGLWidget::resizeGL()
是设置投影矩阵的好地方(因为在调整组件大小时,纵横比会发生变化),除非您的硬件支持ARB_texture_non_power_of_two,否则纹理尺寸必须是2的幂次方。如果您的图像不是2的幂次方,传统技术是创建尽可能最小的2次方纹理,即>=具有
glTexImage2D
的图像大小(传递
NULL
空白数据),然后使用
glTexSubImage2D
将图像加载到其中的一部分,并相应地调整纹理坐标(基于图像在大纹理中占据的宽度/高度的分数)。我建议先尝试绘制一个纯色四边形,以确保其他一切都正常。哦,Duh…抱歉,我在问题注释中给了你一个小标题,没有提到你没有清除深度缓冲区(你不需要禁用深度测试,你只需要在清除颜色缓冲区时清除深度缓冲区)。我希望这些评论中至少有一些在其他方面有所帮助。虽然我下面的回答解决了这个问题,但这才是真正的答案。谢谢你的帮助!