OpenGL代码学习(1)

在配置好OpenGL开发库的环境下,在main.cpp文件中运行如下代码,从而学习。

配置方法:https://www.cnblogs.com/cchHers/p/14674397.html

#include "GLShaderManager.h"
//着色器管理器(shader manager)类。没有着色器,就不能在OpenGL进行着色。着色器管理器不仅允许我们创建并管理着色器,还提供一组”存储着色器“,他们能够进行一些初步基本的渲染操作

#include "GLTools.h"
//该头文件包含了大部分GLTool中类似C语言的独立函数

#include <GLUT/GLUT.h>
//在mac系统下,使用该框架。如果是Windows或Linux上,使用freeglut的i静态b库版本并且需要添加一个宏

GLShaderManager shaderManager;//定义一个着色管理器
GLBatch triangleBatch;//简单的批次容器,是GLTools的一个简单的容器类

/// 重塑函数:在窗口大小改变时,接受新的宽度和高度
void changeSize(int w, int h) {
    // 方式一:
    //glViewport(0, 0, w, h);
    //?? 使用方式一,第一次改变窗口大小时,图片会跳动,原因未知
    
    // 方式二:
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ( );
    gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
    glClear (GL_COLOR_BUFFER_BIT);
}


/// 显示函数
void renderScene(void) {
    // 1 清除缓存区(颜色缓存区、深度缓存区、模板缓存区)
    glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT));
    // 2 设置一组浮点数来表示颜色
    GLfloat vRed[] = {1.f, 0.5f, 0.f, 1.f};
    // 传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标在屏幕上渲染几何图形
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    // 提交着色器
    triangleBatch.Draw();
    // 将后台缓冲区进行渲染,然后结束后交换给前台
    glutSwapBuffers();
}

/// 渲染环境设置
void setupRC() {
    // 设置背景颜色
    glClearColor(0.35f, 0.2f, 0.9f, 1);
    // 初始化一个固定管线染色管理器
    shaderManager.InitializeStockShaders();
    // 指定顶点
    GLfloat vVerts[] = {
        -0.8f, -0.8f, 0.0f,
        0.8f, -0.8f, 0.0f,
        0.5f, 0.7f, 0.0f,
        -0.8f, 0.9f, 0.0f
    };
    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}

int main(int argc, char * argv[]) {
    
    // 初始化GLUT库
    glutInit(&argc, argv);
    // 初始化双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    // GLUT的窗口大小、窗口标题
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL测试");
    
    // 注册重塑函数
    glutReshapeFunc(changeSize);
    // 注册显示函数
    glutDisplayFunc(renderScene);
    
    // 初始化一个GLEW库,确保OpenGL API对程序完全可用
    // 在试图做任何渲染之前,要检查确定驱动程序的初始化过程中没有任何问题
    GLenum status = glewInit();
    if (GLEW_OK != status) {
        printf("GLEW Error:%s\n", glewGetString(status));
        return 1;
    }
    
    // 设置我们的渲染环境
    setupRC();
    
    // 进入GLUT事件处理循环
    glutMainLoop();
    

    return 0;
}

运行后的效果如下:

 

posted @ 2021-04-19 12:46  码出境界  阅读(234)  评论(0编辑  收藏  举报