【一步步学OpenGL 3】-《第一个三角形》
来源:互联网 发布:闪耀迪迦官方数据 编辑:程序博客网 时间:2024/05/01 14:08
教程 3
第一个三角形
原文:http://ogldev.atspace.co.uk/www/tutorial03/tutorial03.html
CSDN完整版专栏: http://blog.csdn.net/column/details/13062.html
背景
这篇教程非常简短,我们只是扩展前一个教程来渲染一个三角形。
这篇教程中我们依然使用那个单位化的盒子模型。可见的点必须在这个盒子内,这样他们将可以通过视窗的变换映射到窗口中可见的坐标上。当俯视Z坐标轴的负方向时这个单位化盒子看上去如下图:
点(-1.0, -1.0)映射到盒子的左下角,(-1.0,1.0)映射到左上角等等。如果将三角形的顶点往盒子外扩展移到盒子外,这个三角形将会被裁剪,只能看到三角形的一部分。
源代码详解:
(1) Vector3f Vertices[3];
Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);
这我们扩展上个教程中的顶点数组使其包含三个顶点;
(2)glDrawArrays(GL_TRIANGLES, 0, 3);
在绘制函数中有两个变化:画三角形而不是点,画三个顶点而不是一个。
示例Demo
#include <stdio.h>#include <GL/glew.h> // GLEW扩展库#include <GLUT/freeglut.h> // freeGLUT图形库#include "ogldev_math_3d.h" // 用于OpenGL的3d数学库GLuint VBO;/** * 渲染回调函数 */static void RenderScenceCB(){ // 清空颜色缓存 glClear(GL_COLOR_BUFFER_BIT); // 开启顶点属性 glEnableVertexAttribArray(0); // 绑定GL_ARRAY_BUFFER缓冲器 glBindBuffer(GL_ARRAY_BUFFER, VBO); // 告诉管线怎样解析bufer中的数据 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); // 开始绘制几何图形(绘制一个三角形,三个顶点) glDrawArrays(GL_TRIANGLES, 0, 3); // 禁用顶点数据 glDisableVertexAttribArray(0); // 交换前后缓存 glutSwapBuffers(); glFlush();}/** * 创建顶点缓冲器 */static void CreateVertexBuffer(){ // 创建含有3个顶点的顶点数组 Vector3f Vertices[3]; // 三角形的三个顶点位置 Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f); Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f); Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f); // 创建缓冲器 glGenBuffers(1, &VBO); // 绑定GL_ARRAY_BUFFER缓冲器 glBindBuffer(GL_ARRAY_BUFFER, VBO); // 绑定顶点数据 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);}/** * 主函数 */int main(int argc, char ** argv) { // 初始化GLUT glutInit(&argc, argv); // 显示模式:双缓冲、RGBA glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // 窗口设置 glutInitWindowSize(480, 320); // 窗口尺寸 glutInitWindowPosition(100, 100); // 窗口位置 glutCreateWindow("Tutorial 03"); // 窗口标题 // 开始渲染 glutDisplayFunc(RenderScenceCB); // 缓存清空后的颜色值 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 检查GLEW是否就绪,必须要在GLUT初始化之后! GLenum res = glewInit(); if (res != GLEW_OK) { fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res)); return 1; } // 创建顶点缓冲器 CreateVertexBuffer(); // 通知开始GLUT的内部循环 glutMainLoop(); return 0;}
运行效果
3 0
- 【一步步学OpenGL 3】-《第一个三角形》
- OpenGL 第一个三角形
- 跟我一起学openGL-第一个三角形
- 第一个OpenGL ES三角形
- 【Modern OpenGL】第一个三角形
- 【Modern OpenGL】第一个三角形
- OpenGL学习(2)-第一个三角形
- Android应用 :第一个 OpenGL ES 三角形
- OpenGL实践2之第一个三角形
- OpenGL学习(三)第一个三角形
- OpenGL(二)第一个OpenGL程序绘制三角形
- OpenGL ES 2.0教程:你的第一个三角形(1)
- OpenGL ES 2.0教程:你的第一个三角形(1)
- openGl超级宝典学习笔记 (1)第一个三角形
- 1.第一个三角形
- ogl 第一个三角形
- 【一步步学OpenGL 1】-《打开一个窗口》
- 【一步步学OpenGL 2】-《你好顶点》
- IAR Linker output 和extra output的区别
- java类执行的顺序
- STL 容器 Deque
- dump分析超级详细分析
- 更新 IDE 和 SDK 工具
- 【一步步学OpenGL 3】-《第一个三角形》
- 编译错误解决(不定期记录)
- SIGHUP信号与控制终端
- spring jpa结合hibernate配置
- 一个项目里添加另一个项目
- 网教9. 一夜发白《千字文》
- px,dp,sp转换工具类
- KaraTsuba乘法——高效的大数乘法
- 输入一个年份判断是否是闰年