openGl超级宝典学习笔记 (1)第一个三角形

运行效果

代码及解析:
//
//  Triangle.cpp
//  Triangle
//
//  Created by fengsser on 15/6/20.
//  Copyright (c) 2015年 fengsser. All rights reserved.
//

#include <GLTools.h>//用作掩盖不同平台的差异,建立窗口等工作
#include <GLShaderManager.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#endif

GLBatch triangleBatch;
GLShaderManager shaderManager;

//窗口大小改变时接受新的宽度和高度,参数单位为象数
void ChangeSize(int w,int h)
{
    //完成从目的坐标系到屏幕坐标系的映射,Glint x,Glint y为viewPort在窗口中左下角的坐标。veiwPort是渲染区域。
    glViewport(0, 0, w, h);
}


//set render-context
void SetupRC()
{
    //设置背影颜色 r,g,b,a
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    //初始化着色管理器
    shaderManager.InitializeStockShaders();
    //设置三角形,其中数组vVert包含所有3个顶点的x,y,z,笛卡尔坐标(就是初中高中学的坐标系)。
    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();
}

//开始渲染
void RenderScene(void)
{
    //清除缓冲区:颜色|深度|模板
    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();
    //将在后台缓冲区进行渲染,然后在结束时交换到前台
    glutSwapBuffers();
}

int main(int argc,char* argv[])
{
    
    gltSetWorkingDirectory(argv[0]);//设置当前工作目录,针对MAC OS X
    glutInit(&argc, argv); //传输命令行参数并初始化GLUT库
    //告诉GLUT库在创建窗口时使用哪种显示模式,GLUT_DOUBLE:双缓冲窗口;GLUT_RGBA:RGBA颜色模式;GLUT_DEPTH:深度测试GLUT_STENCIL:模板测试
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    glutInitWindowSize(800, 600);//GLUT窗口大小,标题窗口
    glutCreateWindow("Triangle");//创建以Triangle为标题的窗口
    //注册侦听,在出循环中会发出事件,窗口大小改变和openGl渲染
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    //初始化openGL驱动程序中丢失的入口点glewInit,并检查初始化是否出现问题。
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "glew error:%s\n",glewGetErrorString(err));
        return 1;
    }
    SetupRC();//RC-Render context
    glutMainLoop();//开始主循环
    return 0;
}

关键流程


关于视口(viewPort)及窗口:

视口,渲染(绘制)区域。一般与窗口等大。视口用于从逻辑笛卡尔坐标系统映射到物理屏幕的像素坐标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值