您的位置:首页 > 运维架构

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

2016-01-04 21:44 246 查看


执行效果

代码及解析:
//
//  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)及窗体:



视口。渲染(绘制)区域。

一般与窗体等大。视口用于从逻辑笛卡尔坐标系统映射到物理屏幕的像素坐标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: