opengl 设置当前绘制颜色_OpenGL学习 - Mac OS 下OpenGL环境搭建

OpenGL学习 - Mac OS 下OpenGL环境搭建

一、工程创建 OpenGLLession01

1、找开Xcode -> macOS -> App

bb0075e21b16ea8a2c235cbe345f053e.png
创建Demo

2、添加系统库文件 OpenGL.framework GLUT.framework

8d328e032ff7ed85ceb0ee4b17c03b5d.png
添加系统框架库

二、添加静态库文件

1、拖入libGLTools.a静态库与头文件

1d34a616e3d483544363be9cbf23bbd6.png
添加OpenGL库文件

网盘库文件 密码: bmi3

2、工程配置: 1、在BuildSettings 中,找到 Header Searchh Paths ,将glew.h与GLTools.h所在的文件夹目录拖到 Header Search Paths 后面去,如下图所示:

e2744314596bfc487666ef60f849f9d6.png

3、删除文件 AppDelegate.h / AppDelegate.m ViewController.h / ViewController.m * main.m

4、创建 main.cpp文件

6a11a920587a145c435c81d1d924c2ba.png
创建main.cpp

4添加代码如下:

#include <stdio.h>

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

#include <GLUT/GLUT.h>


#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"


#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmacro-redefined"

/* 定义一个着色管理器,没有着色器,我们就不能在OpenGL(核心框架)进行着色。
 着色器管理器不仅允许我们创建并管理着色器,还提供一组“存储着色器“,他们能够进行一些初步的基本渲染操作
 */
GLShaderManager shaderManager;

// 简单的批次容器
GLBatch     triangleBatch;

/**
 * 说明:在窗口大小改变时,接收新的宽度与高度
 */
void DffdChangeSizeFun(int nWidth, int nHeigh) {

    // x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是像素的表示,通常x,y都是0
    glViewport(0, 0, nWidth, nHeigh);
}

void DffdRenderSceneFun(void) {

    /* 清除一个或一组特定的缓冲区
     缓冲区是一块存在图像信息的储存空间,红、绿、蓝和alpha分量通常一起作为颜色缓冲区或像素缓冲区引用。
     OpenGL中不止一种缓冲区(颜色缓冲区、深度缓冲区和模板缓冲区)
     清除缓冲区对数值进行预置
     参数:指定要清除的缓存
     GL_COLOR_BUFFER_BIT    : 指示当前激活的用来进行颜色写入的缓冲区
     GL_DEPTH_BUFFER_BIT    : 指示深度缓冲区
     GL_STENCIL_BUFFER_BIT  : 指示模板缓冲区
    */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    // 设置一组浮点数来表示颜色
    GLfloat vRed[] = {1.0f, 0.0f, 0.0f, 1.0f};

    // 传递到存储着色器,即GLT_SHADER_IDENTITY 着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标在屏幕上渲染几何图形
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);

    // 提交着色器
    triangleBatch.Draw();

    /*
     在开始的设置OpenGL窗口的时候,我们指定要一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行
     */
    // 将后台缓冲区进行渲染,然后结束后交换给前台
    glutSwapBuffers();
}

void DffdSetupRCFun () {

    // 设置清屏颜色(背景颜色)
    glClearColor(0.0, 0.50, 0.5, 1.0f);

    // 初始化一个渲染管理器,没有着色器,在OpenGL核心框架中是无法进行任何渲染操作。
    shaderManager.InitializeStockShaders();

    // 确定绘制顶点数据
    GLfloat vVerts[] = {

        -0.5f, 0.0f, 0.0f,
        0.5f, 0.0f, 0.0f,
        0.0f, 0.5f, 0.0f
    };

    triangleBatch.Begin(GL_TRIANGLES, 3);

    triangleBatch.CopyVertexData3f(vVerts);

    triangleBatch.End();


}

int main(int argc, char *argv[]) {

    // 初始化GLUT库,这个函数只是传命令参数并且初始化GLUT库
    glutInit(&argc, argv);

    /*
     初始化双缓冲区,其中标志
     GLUT_DOUBLE    : 双缓冲区,是指绘制命令实际上是离屏缓存区进行执行的,然后讯速转换成窗口视图,这种方式,经常用来生成动画效果;
     GLUT_RGBA      : RGBA颜色缓冲区
     GLUT_DEPTH     : 深度测试缓冲区,标志将一个深度缓冲区分配为显示的一部分,因此我们能够执行深度测试;
     GLUT_STENCIL   : 模板缓冲区,确保我们也会有一个可用的模板缓冲区

     */
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

    // GLUT窗口大小,窗口标题
    glutInitWindowSize(800, 600);
    glutCreateWindow("绘制三角形");

    // 注册重塑函数
    /**
     * GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数,我们一共注册两个回调函数
     * 为窗口改变大小而设置的一个回调函数(DffdChangeSizeFun)
     * 包含OpenGL 渲染的回调函数(DffdRenderSceneFun)
     */
    glutReshapeFunc(DffdChangeSizeFun);
    glutDisplayFunc(DffdRenderSceneFun);

    // 初始化一个GLEW库,确保OpenGL API对程序完全可用
    GLenum status = glewInit();
    if ( GLEW_OK != status ) {

        printf("GLEW Error:%sn", glewGetErrorString(status));
        return 1;
    }

    // 设置我们的渲染环境
    DffdSetupRCFun();

    glutMainLoop();

    return 0;
}

网盘Demo 密码: i7bl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值