zoukankan      html  css  js  c++  java
  • 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; 

    ^_^今天继续。

  • 相关阅读:
    第二篇:服务消费者Feign
    第一篇:服务的注册与发现Eureka(Finchley版本)
    记一次包扫描的犯错
    0.简单工厂-simplefactory(非23之一)
    设计模式基础
    设计模式--六大设计原则
    Java中的包
    Java内部类
    Java多线程
    Java同步
  • 原文地址:https://www.cnblogs.com/ForRickHuan/p/5686593.html
Copyright © 2011-2022 走看看