C++ 纹理贴图在Windows中不起作用
我想使用opengl将视频渲染到glwidget。目前我正在使用glDrawPixels来渲染视频。它在windows和linux中运行良好。为了获得更好的性能,我尝试使用linux进行纹理映射,但在windows中我得到了白色屏幕。 你能帮我解决这个问题吗?同时附上样本代码C++ 纹理贴图在Windows中不起作用,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,我想使用opengl将视频渲染到glwidget。目前我正在使用glDrawPixels来渲染视频。它在windows和linux中运行良好。为了获得更好的性能,我尝试使用linux进行纹理映射,但在windows中我得到了白色屏幕。 你能帮我解决这个问题吗?同时附上样本代码 GLWidget::GLWidget(QWidget *parent) : QGLWidget (parent) { initializeGL(); DisplayImage(); } void GLWid
GLWidget::GLWidget(QWidget *parent) : QGLWidget (parent)
{
initializeGL();
DisplayImage();
}
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);
DisplayImage();
}
void GLWidget:: DisplayImage( )
{
QImage img;
if(!img.load("1146625_532685140120225_1868914019_n.jpg")){
// std::cerr << "ERROR in loading image" << std::endl;
}
img = img.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio);
QImage t = QGLWidget::convertToGLFormat(img);
glGenTextures(1, &imageID);
glBindTexture(GL_TEXTURE_2D, imageID);
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::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// gluOrtho2D(0, width, height, 0); // flip the y axis
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
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_TEXTURE_2D);
glColor3f(1.5, 1.5, 1);
glBindTexture(GL_TEXTURE_2D,imageID);
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();
}
GLWidget::GLWidget(QWidget*parent):QGLWidget(parent)
{
初始化egl();
显示图像();
}
void GLWidget::initializeGL()
{
//qglClearColor(qtback.dark());
glEnable(GL_CULL_面);
glShadeModel(GL_平滑);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
//glEnable(GL_多样本);
静态GLfloat lightPosition[4]={0.5,5.0,7.0,1.0};
glLightfv(GL_LIGHT0,GL_位置,lightPosition);
//cameraPos=0;
glEnable(GL_纹理_2D);
显示图像();
}
void GLWidget::DisplayImage()
{
QImage img;
如果(!img.load(“1146625_532685140120225_1868914019_n.jpg”)){
//std::cerr height(),Qt::IgnoreAspectRatio);
QImage t=QGLWidget::convertToGLFormat(img);
glGenTextures(1,&imageID);
glBindTexture(GL_TEXTURE_2D,imageID);
GLTEXAGE2D(GL_纹理_2D,0,3,t.宽度(),t.高度(),0,GL_RGBA,GL_无符号_字节,t.位());
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glBindTexture(GL_TEXTURE_2D,0);
}
void GLWidget::resizeGL(整数宽度、整数高度)
{
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
//gluOrtho2D(0,宽度,高度,0);//翻转y轴
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void GLWidget::paintGL()
{
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClear(GLU颜色缓冲位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glShadeModel(GLU平面);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glEnable(GL_纹理_2D);
GL3F(1.5,1.5,1);
glBindTexture(GL_TEXTURE_2D,imageID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,1.0f);glVertex2f(-0.5f,0.5f);//顶点1
glTexCoord2f(0.0f,0.0f);glVertex2f(-0.5f,-0.5f);//顶点2
glTexCoord2f(1.0f,0.0f);glVertex2f(0.5f,-0.5f);//顶点3
glTexCoord2f(1.0f,1.0f);glVertex2f(0.5f,0.5f);//顶点4
格伦德();
glDisable(GL_纹理_2D);
glFlush();
}
@BartekBanachewicz是的,我在调用GltexImage2d后遇到1281个错误。你考虑过修复它吗?@BartekBanachewicz我试图通过更改宽度和高度来解决这个问题。如果它是256*256,我得到的是正确的图像。如果宽度和高度是2的幂,那么只有它工作。我们能克服这个限制吗?NPOT(非二次幂)纹理支持可能取决于驱动程序。如果您使用的是OpenGL版本和图形卡,则可能无法使用非二次幂纹理