OpenGL第6、7讲小结

  因为内容比较多,所以只看了两讲(强行解释)。

  一讲讲了如何给各个面贴纹理,一讲讲了加光照和按键控制。

  现在讲的都是给规则的面贴纹理,像正方形,刚好纹理图也是正方形,那像人物模型的衣服贴起来用代码控制得多麻烦啊。

  在创建纹理贴图的时候,一次创建多少个就要修改其参数

之前只贴一种纹理的时候,哪怕我for循环六个面贴了不同纹理,但每次只创建了一个,所以是1,之后此程序一次创建了三个纹理,故写成了3,为了六个面不同,我用了二维数组

 

这样就可以既满足6个面都不同,又可以满足三种效果的切换。

贴一下每个面使用不同的纹理的代码。

 

//////////////////////
    glTranslatef(0.0f,0.0f,z);                        // 移入/移出屏幕 z 个单位
    glRotatef(xrot,1.0f,0.0f,0.0f);                        // 绕X轴旋转
    glRotatef(yrot,0.0f,1.0f,0.0f);                        // 绕Y轴旋转

    //1////////////////////////////////////

    // 前侧面

    glBindTexture(GL_TEXTURE_2D, texture[1][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    glNormal3f( 0.0f, 0.0f, 1.0f);                    // 法线指向观察者
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    glEnd();    

    glBindTexture(GL_TEXTURE_2D, texture[0][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    // 后侧面
    glNormal3f( 0.0f, 0.0f,-1.0f);                    // 法线背向观察者
    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    glEnd();        

    glBindTexture(GL_TEXTURE_2D, texture[2][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    // 顶面
    glNormal3f( 0.0f, 1.0f, 0.0f);                    // 法线向上
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    glEnd();

    glBindTexture(GL_TEXTURE_2D, texture[3][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    // 底面
    glNormal3f( 0.0f,-1.0f, 0.0f);                    // 法线朝下
    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    glEnd();

    glBindTexture(GL_TEXTURE_2D, texture[4][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    // 右侧面
    glNormal3f( 1.0f, 0.0f, 0.0f);                    // 法线朝右
    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    
    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    
    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    
    // 左侧面
    glEnd();

    glBindTexture(GL_TEXTURE_2D, texture[5][filter]);                // 选择由filter决定的纹理
    glBegin(GL_QUADS);                            // 开始绘制四边形
    glNormal3f(-1.0f, 0.0f, 0.0f);                    // 法线朝左
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    
    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    
    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    
    glEnd();                                // 四边形绘制结束
    

  之后一位师兄问我说,能不能用鼠标滚轮控制图形的远近,我百度了下,可以是可以,但是都是这样子的main()函数,

void main(int argc,char **argv)

 

而例子用的是

int WINAPI WinMain(    HINSTANCE    hInstance,            // Instance
                    HINSTANCE    hPrevInstance,        // Previous Instance
                    LPSTR        lpCmdLine,            // Command Line Parameters

                    int            nCmdShow)            // Window Show State

连运行都需要切换这个属性:

所以,不开心,明天再查查看两个的区别,或者等学完了自己再用c的通用main()函数来写一下好了。先到这里吧。晚安。

ps:是可以换成main()函数的,把

WINAPI WinMain
中的四个参数写到函数里面就好啦,就像这样:
int main(int argc,char **argv)
//int WINAPI WinMain(    HINSTANCE    hInstance,            // Instance
//                    HINSTANCE    hPrevInstance,        // Previous Instance
//                    LPSTR        lpCmdLine,            // Command Line Parameters
//
//                    int            nCmdShow)            // Window Show State
{
    HINSTANCE hInstance;
    HINSTANCE    hPrevInstance;
    int nCmdShow;
    LPTSTR lpCmdLine; 

^_^今天继续。

posted @ 2016-07-19 22:54  琐碎之人  阅读(216)  评论(0编辑  收藏  举报