C++ 旋转纹理openGL c++;

C++ 旋转纹理openGL c++;,c++,opengl,opencv,glut,C++,Opengl,Opencv,Glut,当我从openCV图像制作纹理时,它总是旋转180度,这是为什么?这是我的代码,它绑定纹理并在屏幕上显示。 如果代码规范,建议我如何正确旋转纹理,我无法得到它 glBindTexture( GL_TEXTURE_2D, slice.texture); glLoadIdentity(); glEnable(GL_TEXTURE_2D); //enable 2D texturing glBegin (GL_QUADS); float nullX = slObj->rect.x/400.0;

当我从openCV图像制作纹理时,它总是旋转180度,这是为什么?这是我的代码,它绑定纹理并在屏幕上显示。 如果代码规范,建议我如何正确旋转纹理,我无法得到它

glBindTexture( GL_TEXTURE_2D, slice.texture);
glLoadIdentity();
glEnable(GL_TEXTURE_2D); //enable 2D texturing

glBegin (GL_QUADS);

float nullX = slObj->rect.x/400.0;
float nullY = slObj->rect.y/300.0;

float sliceWidth = slObj->rect.width/400.0;
float sliceHeight = slObj->rect.height/300.0;

//with our vertices we have to assign a texcoord
//so that our texture has some points to draw to
glTexCoord2d(0.0,0.0); glVertex2f(nullX, nullY);
glTexCoord2d(1.0,0.0); glVertex2f(nullX + sliceWidth, nullY);
glTexCoord2d(1.0,1.0); glVertex2f(nullX + sliceWidth, nullY + sliceHeight);
glTexCoord2d(0.0,1.0); glVertex2f(nullX, nullY + sliceHeight);
glEnd();
glFlush();
更新:

// initialize
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glClearColor(0.3,0.3,0.3,0.0);
glMatrixMode(GL_PROJECTION); 
glOrtho(-400.0 ,400.0 ,-300.0 ,300.0 ,0 ,1.0); 

投影矩阵是如何设置的

假设您有一个传统的投影矩阵,其中Y轴从屏幕底部向顶部增加,则这些坐标是正确的。另一方面,如果您反转投影矩阵,使(0,0)实际上是屏幕的左上角,那么您就有问题了


如果是这种情况,纹理不是真正旋转的,而是镜像的。没有旋转可以产生这样的情况,这就是所谓的旋转变化。您可以使用传统的投影矩阵,其中Y轴的行为如前所述,或者在计算纹理坐标时通过翻转第二个纹理坐标(T)进行补偿。

当我使用openCV加载和切片图像时,我只需翻转图像

IplImage *source = cvLoadImage("space.png",1);
if(source == NULL) source = cvLoadImage("C://space.png",1);

cvFlip(source, source, 0);

谢谢大家的帮助

@gronzz:你的投影矩阵是正确的。我开始怀疑OpenCV将图像的原点(0,0)定义为左上角,而OpenGL使用左下角。我不熟悉API,但许多成像API和格式允许您重新定义原点和/或镜像/翻转一个轴上的图像。如果无法执行此操作,则始终可以将纹理矩阵乘以
glScale(1.0,-1.0,1.0)以重新定义原点。注意,这仅适用于固定函数OpenGL。