• 5832阅读
  • 3回复

求救:先用顶点缓冲区对象画了物体,再用renderText()无效? [复制链接]

上一主题 下一主题
离线cxfczw
 
只看楼主 倒序阅读 楼主  发表于: 2012-10-13
搞个Cansva对象,继承于QGLWidget类
我先用顶点缓冲区对象画个物体,再用renderText(x,y,...)在屏幕上写文本,不报错,但什么文本也没有看见。
但如果我先用顶点数组画同样的物体,再用renderText(x,y,...)在屏幕上写文本,就很正常。

怎么回事呢?有谁能指点下?先谢了。
//代码通过类封装过,列少了没效果,就不列了。
测试代码列在下面了,就3个文件,大家连上glee.c glee.h也好,用glew也好,帮忙看看。



离线cxfczw
只看该作者 1楼 发表于: 2012-10-13
测试代码   thecanvas.cpp

#include "GLee.h"
#include <QtGui>
//#include <QtOpenGL>
#include <gl/glu.h>
//#include <glut.h>
#include "thecanvas.h"

GLfloat verts[8][3]={
    {-1.0,-1.0,1.0},
    {1.0,-1.0,1.0},
    {1.0,1.0,1.0},
    {-1.0,1.0,1.0},
    {1.0,-1.0,-1.0},
    {1.0,1.0,-1.0},
    {-1.0,1.0,-1.0},
    {-1.0,-1.0,-1.0}};
GLushort indexes[6][4]={
    {0,1,2,3},
    {1,4,5,2},
    {4,7,6,5},
    {7,0,3,6},
    {2,5,6,3},
    {0,1,4,7}};
GLuint dataOBVID;   //顶点缓冲区对象
GLuint indexOBVID;  //索引缓冲区对象

void RenderScene1();    //用顶点数组方式画立方体并用renderText()写文本。
void RenderScene2();    //用顶点缓冲区对象方式画立方体并用renderText()写文本。

TheCanvas::TheCanvas(QWidget *parent) :
    QGLWidget(parent)
{
    //本语句必须放这里,若放到initializeGL()会导致窗口不能正常关闭。
    setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer | QGL::SampleBuffers));

    timer=new QTimer(this);
    timer->setInterval(10);
    timer->setSingleShot(false);
    connect(timer,SIGNAL(timeout()),this,SLOT(updateGL()));
}
TheCanvas::~TheCanvas()
{
    glDeleteBuffers(1,&dataOBVID);
    glDeleteBuffers(1,&indexOBVID);
}

void TheCanvas::initializeGL()
{
    glClearColor(0.0f,0.0f,0.0f,1.0f);//设置glClear()函数使用的背景颜色
    glShadeModel(GL_FLAT); //单调着色模式GL_FLAT用多边形最后一个顶点的颜色着色,不插值;光滑明暗处理GL_SMOOTH插值计算顶点间颜色
    glEnable(GL_DEPTH_TEST);    //启用深度测试(即Z缓冲)
    //glEnable(GL_STENCIL_TEST);  //启用模版缓冲测试
    //glEnable(GL_CULL_FACE);     //启用背面剔除模式
    glEnable(GL_NORMALIZE);     //让OpenGL自动把法向量规范化
    glEnable(GL_MULTISAMPLE);   //启动反走样
    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//以线框模式绘制一切物体
    //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//支持双缓冲(在Qt中由setFormat代替了)

    //--设置雾效------------------------------------------
    glFogi(GL_FOG_MODE,GL_EXP);//设置雾方程(共三种方程:GL_LINEAR,GL_EXP,GL_EXP2)
    GLfloat fogColor[4]={0.5,0.5,0.5,1.0};
    glFogfv(GL_FOG_COLOR,fogColor);  //设置雾的颜色
    glFogf(GL_FOG_DENSITY,0.1f);    //设置雾的浓度(默认1.0f)
    glFogf(GL_FOG_START,600.0);   //设置雾的起始位置
    glFogf(GL_FOG_END,10000.0f);     //设置雾的结束位置
    glHint(GL_FOG_HINT,GL_DONT_CARE);//规定雾化的质量(GL_FASTEST:速度最快;GL_NICEST:最高质量;GL_DONT_CARE:对选项不做考虑)
    //glEnable(GL_FOG);   //打开雾效
    glDisable(GL_FOG);   //关闭雾效
    //---------------------------------------------------

    //---初始化顶点缓冲区对象------------------------------
    glGenBuffers(1,&dataOBVID);
    glBindBuffer(GL_ARRAY_BUFFER,dataOBVID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*8*3, verts, GL_STATIC_DRAW);

    glGenBuffers(1,&indexOBVID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexOBVID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(GLfloat)*6*4,indexes,GL_STATIC_DRAW);
    //--------------------------------------------------
}

void TheCanvas::paintGL()
{
    //清除缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //RenderScene1();
    RenderScene2();

    if(!timer->isActive()) timer->start();  //开启计时器连续渲染
}

void RenderScene1()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnableClientState(GL_VERTEX_ARRAY);

    glTranslatef(0.0f,0.0,-10.0f);
    glRotatef(15.0f,0.0,1.0,0.0);
    glRotatef(15.0f,1.0,0.0,0.0);

    glVertexPointer(3,GL_FLOAT,0,verts);
    glDrawElements(GL_QUADS,6*4,GL_UNSIGNED_SHORT,indexes);

    glDisableClientState(GL_VERTEX_ARRAY);

    canvas->setFont(QFont("Times",14));
    glColor3ub(178,0,0);
    canvas->renderText(0,18,QString("AAAAAAAAAAA"));
}

void RenderScene2()
{

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnableClientState(GL_VERTEX_ARRAY);

    glTranslatef(0.0f,0.0,-10.0f);
    glRotatef(15.0f,0.0,1.0,0.0);
    glRotatef(15.0f,1.0,0.0,0.0);

    glBindBuffer(GL_ARRAY_BUFFER,dataOBVID);
    glVertexPointer(3,GL_FLOAT,0,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexOBVID);
    glVertexPointer(3,GL_FLOAT,0,0);
    glDrawElements(GL_QUADS,6*4,GL_UNSIGNED_SHORT,0);

    glDisableClientState(GL_VERTEX_ARRAY);

    canvas->setFont(QFont("Times",14));
    glColor3ub(178,0,0);
    canvas->renderText(0,18,QString("AAAAAAAAAAA"));
}

void TheCanvas::resizeGL(int width, int height)
{
    //根据窗口大小设置视口
    glViewport(0,0,width,height);

    //重置投影矩阵堆栈
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //建立裁减区域
/*    GLfloat nRangle=100.0f;
    if(width<=height){
        glOrtho(-nRangle,nRangle,-nRangle*height/width,nRangle*height/width,
                -nRangle,nRangle);
    }else{
        glOrtho(-nRangle*width/height,nRangle*width/height,-nRangle,nRangle,
                -nRangle,nRangle);
    }
*/
    GLfloat xRatio=GLfloat(width)/height;
    //glFrustum(-xRatio,+xRatio,-1.0,+1.0,0.0,150.0);
    gluPerspective(60.0,xRatio,1.0,1000.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
离线cxfczw
只看该作者 2楼 发表于: 2012-10-13
测试代码   thecanvas.h

#ifndef THECANVAS_H
#define THECANVAS_H

#include <QGLWidget>

class TheCanvas : public QGLWidget
{
    Q_OBJECT
public:
    explicit TheCanvas(QWidget *parent = 0);
    ~TheCanvas();

protected:
    //This initializeGL() function is called once before the first call
    //to paintGL() or resizeGL(), and then once whenever the widget has
    //been assigned a new QGLContext.
    void initializeGL();
    void resizeGL(int width,int height);
    void paintGL();

private:
    QTimer *timer;

signals:
    
public slots:
    
};

extern TheCanvas *canvas;
#endif // THECANVAS_H
离线cxfczw
只看该作者 3楼 发表于: 2012-10-13
测试代码   main.cpp

#include <QApplication>
#include <iostream>

#include "thecanvas.h"
TheCanvas *canvas;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    if (!QGLFormat::hasOpenGL()) {
        std::cerr << "This system has no OpenGL support" << std::endl;
        return 1;
    }

    canvas=new TheCanvas;
    canvas->setWindowTitle(QObject::tr("This is a test."));
    canvas->resize(1024, 768);
    canvas->show();

    return app.exec();
}
快速回复
限100 字节
 
上一个 下一个