我编写了一个使用OpenGL和GLUT的小型示例程序,使用glDrawPixels函数显示由四个有色方块组成的2×2网格。不幸的是,我发现:
下面的C++代码片段显示示例图像。我在这里做错了什么,我应该更改什么来查看预定的颜色并旋转像素映射?
struct RGB
{
unsigned char r, g, b;
};
class Pixmap
{
public:
RGB color[4];
Pixmap()
{
color[0].r = 255;
color[0].g = 0;
color[0].b = 0;
color[1].r = 0;
color[1].g = 255;
color[1].b = 0;
color[2].r = 0;
color[2].g = 0;
color[2].b = 255;
color[3].r = 255;
color[3].g = 255;
color[3].b = 255;
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawPixels( 2, 2, GL_RGB, GL_UNSIGNED_BYTE, color );
glFlush();
}
};
// Create an instance of class Pixmap
Pixmap myPixmap;
void myRender()
{
myPixmap.render();
}
int main( int argc, char *argv[] )
{
int screenWidth, screenHeight;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
screenWidth = glutGet(GLUT_SCREEN_WIDTH);
screenHeight = glutGet(GLUT_SCREEN_HEIGHT);
int windowWidth = screenHeight / 2;
int windowHeight = screenHeight / 2;
glutInitWindowSize(windowWidth, windowHeight);
int posX = (screenWidth - windowWidth) / 2;
int posY = (screenHeight - windowHeight) / 4;
glutInitWindowPosition(posX, posY);
glutCreateWindow("Picture");
GLfloat scaleX = 1.0f * windowWidth / 2;
GLfloat scaleY = 1.0f * windowHeight / 2;
glMatrixMode( GL_PROJECTION );
// If glPixelZoom(-scaleX, scaleY)
// then no image is displayed
glPixelZoom(scaleX, scaleY);
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0f, 0.0f, 0.0f);
glutDisplayFunc( myRender );
glutMainLoop();
}发布于 2010-08-29 12:00:52
glMatrixMode( GL_PROJECTION );上线是造成问题的一条。将其更改为"glMatrixMode(GL_MODELVIEW);“,因为您实际上并没有将投影矩阵用于任何事情。
投影矩阵用于设置投影参数,如透视/正射模式、视场等。这通常需要在创建窗口时和窗口/视口大小变化时进行。模型视图矩阵用于平移、旋转和缩放。
由于OpenGL的工作方式,跟踪“状态”是非常重要的。一般工作流程是设置投影模式,根据需要更改参数,然后立即更改为模型视图模式,如下所示:
glMatrixMode(GL_PROJECTION);
//...
//do various projection stuff
//...
glMatrixMode(GL_MODELVIEW);这适用于OpenGL中的许多东西,不仅是矩阵状态,还包括其他东西,如灯光、混合等等。非常常见的情况是,在执行另一组操作之前,在执行一组操作之后返回“默认”状态,然后再次切换回默认状态。
https://stackoverflow.com/questions/3593283
复制相似问题