opengl使用总结(包含遇到的问题以及解决之道)

1.  gluLookAt使用方法:
 glMatrixMode( GL_MODELVIEW );
    // 重置模型观察矩阵。
    glLoadIdentity();
    // 选择模型观察矩阵
    gluLookAt( 3.0f, 2.5f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f );
注:在调用gluLookAt之前一定要记得调用glLoadIdentity来重置当前指定的矩阵为单位矩阵.不然就会出问题


2. 进行纹理映射时发现纹理和颜色混合了,解决之道:

要屏蔽glcolor3f的影响,只需添加:

glColor3f(1.0, 1.0, 1.0 );  //使得下面正方体的纹理映射不受最下面的正方体和四面体中的glColor3f的影响
或添加:glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);


3. opengl中进行纹理贴图时不显示贴图图片,调试时发现:
glGenTextures(6, &texture[i]); 
glBindTexture(GL_TEXTURE_2D, texture[i]);
//绑定纹理图片后,发现texture数组始终为0,原因是加载纹理,调用glGenTextures之前应该完成opengl窗口
的初始化,即完成下面调用:
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);  
glutInitWindowPosition(0, 0);
glutInitWindowSize(800, 600);
glutCreateWindow("Wander");
wander.load_GL_textures1(); //此时才能调用加载纹理函数,调用纹理载入子例程


1.

 glFrontFace(GL_CCW); //指定逆时针为正面

    glCullFace(GL_BACK); // 使得背面不可见

    glEnable(GL_CULL_FACE);

 

2.

// 金字塔物体没进行纹理映射,所以此时不应该启用纹理映射,否则会看不到该物体

//glEnable(GL_TEXTURE_2D);

// 启用纹理映射,在要进行纹理映射的物体前启用纹理映射,绘制完物体后关闭纹理映射,若在所有绘制物体前启用,若某个物体未使用glTexCoord2f,则该物体将会看不见

 

3.

    glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);  // Clear Screen And Depth Buffer

    glMatrixMode(GL_MODELVIEW); //设置模型观察矩阵,作用是用于在三维空间中确定物体的位置

    glLoadIdentity(); //M=I,I为单位矩阵

 

    glColor3f( 1.0f, 0.0f, 0.0f );

    glBegin(GL_TRIANGLES);

    glVertex3f( 0.0f, 2.0f, 0.0f);

    glVertex3f( -1.0f, -1.0f, 0.0f);

    glVertex3f( 1.0f, -1.0f, 0.0f);

    glEnd();

 

    glTranslatef( 1.0f, 3.0f, 0.0f);//x平移1个单位,y平移3个单位,z保证不变,对应的矩阵:

    // 平移后,M=M*K=I*K,K为x平移1个单位,y平移3个单位,z保证不变的平移矩阵

    //glRotatef(90.0f, 0.0f, 0.0f, 1.0f ); //逆时针旋转90

    glRotatef( -90.0f, 0.0f, 0.0f,1.0f ); //顺时针旋转90

    //旋转后,M=M*R=K*R,R为上面对应的选择矩阵

    /*

    K=

    1     0    0     1

    0     1    0     3

    0     0    1     0

    0     0    0     1

 

    绕z轴旋转@度的旋转矩阵,R=

    cos@     -sin@    0     0

    sin@     cos@     0     0

    0        0        1     0

    0        0         0    1

    @=-90代入之得:

    0     1    0     0

    -1     0    0     0

    0     0    1     0

    0     0    0     1

    得M=

    0     1    0     1

    -1     0    0     3

    0     0    1     0

    0     0    0     1

    然后把下面三个坐标的齐次坐标右乘M,即得最终的坐标位置,

    P'= MP,P为原始坐标对应的齐次坐标,如第一个点(0.0,2.0,0.0)的齐次坐标为(0.0,2.0,0.0,1.0)

    得到最终的三个坐标位置为:

   

    A1 =

    3

    3

    0

    1

 

    A2 =

    0

    4

    0

    1

 

    A3 =

    0

    2

    0

    1

    最终画出该三个点对应的三角形

    */

 

    glColor3f(1.0f, 0.0f, 0.0f );

    glBegin(GL_TRIANGLES);

    glVertex3f(0.0f, 2.0f, 0.0f );

    glVertex3f(-1.0f, -1.0f, 0.0f );

    glVertex3f(1.0f, -1.0f, 0.0f );

    glEnd();

结果如下:

opengl使用总结(包含遇到的问题以及解决之道)_第1张图片

注:OpenGL使用的是右乘

 

 

4. 纹理映射的图片尺寸最大不能超过256*256,最好用bmp图片

此图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用图像处理软件重新改变图像的大小。

我曾经说过有办法可以绕过OpenGL对纹理宽度和高度所加的限制——64、128、256,等等。办法就是 gluBuild2DMipmaps。据我的发现,您可以使用任意的位图来创建纹理。OpenGL将自动将它缩放到正常的大小。

    gluBuild2DMipmaps(GL_TEXTURE_2D,3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB,GL_UNSIGNED_BYTE, TextureImage[0]->data);

注:好像只能加载bmp图片,不能是其他类型的图片

 

5.

/*

    目的是为了重置模型观察矩阵。如果我们没有重置,直接调用glTranslate的话,会出现意料之外的结果。

    因为坐标轴已经旋转了,很可能没有朝着您所希望的方向。所以我们本来想要左右移动对象的,

    就可能变成上下移动了,取决于您将坐标轴旋转了多少角度。

    */

   

6. 默认视点位置:

视点默认的位置在(0,0,0)点,朝向是垂直屏幕向里(即Z轴负方向)。

你在绘制物体的时候注意把物体的Z坐标向后移几个单位就看见了。

视点默认不用改,要想改,可以通过设置glLookAt函数设置

 

7.

glGenTextures(3, &texture[0]);                  // 创建纹理 glGenTextures函数根据纹理参数返回n个纹理索引,&texture[0]存储纹理索引

        // 创建 Nearest滤波贴图

        /*

        glBindTexture实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的纹理对象的,

        比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的

        */

8. OpenGL不设置颜色,直接绘制四个顶点,得到的正方形,默认会为白色;

9.  





你可能感兴趣的:(opengl)