zoukankan      html  css  js  c++  java
  • OpenGL代码学习(2)

    #include "GLShaderManager.h"//着色管理器类
    #include "GLTools.h"//包含了大部分GLTool中类似C语言的独立函数
    #include <GLUT/GLUT.h>//在Mac系统下使用GLUT,在Window或Linux上使用的是freeglut的静态库
    
    GLShaderManager shaderManager;//定义一个着色管理器
    GLBatch triangleBatch;//简单的批次容器,是GLTools的一个简单的容器类
    
    GLfloat blockSize = 0.2f;//边长
    
    GLfloat vVerts[] = {
        -blockSize/2, -blockSize/2, 0.f,
        blockSize/2, -blockSize/2, 0.f,
        blockSize/2, blockSize/2, 0.f,
        -blockSize/2, blockSize/2, 0.f
    };//正方形的4个点坐标
    
    void changeSize(int w, int h) {
        glViewport(0, 0, w, h);
        
        printf("w:%d   h:%d
    ", w, h);
        
    //    glMatrixMode (GL_PROJECTION);
    //    glLoadIdentity ( );
    //    gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
    //    glClear (GL_COLOR_BUFFER_BIT);
    };
    
    void RenderScene(void) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
        GLfloat vRed[] = {1.f, 0.f, 0.f, 1.f};
        shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
        triangleBatch.Draw();
        glutSwapBuffers();
    };
    
    void setupRC(void) {
        glClearColor(0.98f, 0.40f, 0.70f, 1);
        shaderManager.InitializeStockShaders();
        triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
        triangleBatch.CopyVertexData3f(vVerts);
        triangleBatch.End();
    }
    
    void SpecialKeys(int key, int x, int y) {
        GLfloat stepSize = 0.025f;
        GLfloat blockX = vVerts[0];
        GLfloat blockY = vVerts[10];
        
        printf("v[0] = %f
    ", vVerts[0]);
        printf("v[10] = %f
    ", vVerts[10]);
        
        if (key == GLUT_KEY_UP) {
            blockY += stepSize;
        }
        if (key == GLUT_KEY_DOWN) {
            blockY -= stepSize;
        }
        if (key == GLUT_KEY_LEFT) {
            blockX -= stepSize;
        }
        if (key == GLUT_KEY_RIGHT) {
            blockX += stepSize;
        }
        
        // 触碰到边界的处理
        if (blockX < -1.f) {
            blockX = -1.f;
        }
        if (blockX > (1.f - blockSize)) {
            blockX = 1.f - blockSize;
        }
        if (blockY < (-1.f + blockSize)) {
            blockY = -1.f + blockSize;
        }
        if (blockY > 1.f) {
            blockY = 1.f;
        }
        
        vVerts[0] = blockX;
        vVerts[1] = blockY - blockSize;
        
        vVerts[3] = blockX + blockSize;
        vVerts[4] = blockY - blockSize;
        
        vVerts[6] = blockX + blockSize;
        vVerts[7] = blockY;
        
        vVerts[9] = blockX;
        vVerts[10] = blockY;
        
        triangleBatch.CopyVertexData3f(vVerts);
        glutPostRedisplay();
    }
    
    int main(int argc, char * argv[]) {
        
        gltSetWorkingDirectory(argv[0]);
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
        glutInitWindowSize(800, 700);
        //glutInitWindowSize(800, 720);
        glutCreateWindow("OpenGL测试");
        
        glutReshapeFunc(changeSize);
        glutDisplayFunc(RenderScene);
        glutSpecialFunc(SpecialKeys);
        
        GLenum status = glewInit();
        if (GLEW_OK != status) {
            printf("GLEW Error:%s
    ", glewGetErrorString(status));
            return 1;
        }
        
        // 设置渲染环境
        setupRC();
        
        glutMainLoop();
        
        return 0;
    }
    

      

  • 相关阅读:
    几个比较好的IT站和开发库官网
    Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案
    QT5.2 Assistant-设置应用程序图标
    linux下文件编码格式转换方法(gb18030/utf-8)
    QT-进制转换计算器
    QT-图标设置
    QT-make: *** No rule to make target
    QT的exe文件打开显示,无法定位程序***输入点于动态链接库****
    QT工程文件上传Github仓库
    Eclipse中文乱码
  • 原文地址:https://www.cnblogs.com/cchHers/p/14685230.html
Copyright © 2011-2022 走看看