【一步步学OpenGL 3】-《第一个三角形》

翻译 2016年09月10日 13:27:12

教程 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;
}

运行效果

这里写图片描述

相关文章推荐

lib与dll的关系(详解静态链接库和动态链接库)

最近接触到的游戏会有很多的dll和lib文件,之前关于动态链接库和静态链接库一直很不理解,最近发现了一篇很好的文章,非常清晰的讲解了dll与lib的关系,这里拿出来给大家分享下。 原文链接: ...

【一步步学OpenGL 1】-《打开一个窗口》

@专栏介绍:这里开一个专栏,翻译OGLdev的系列教程《OpenGL Step by Step》,由于本人是个程序员,所以对教程不会完全的简单直译,会根据自己的理解进行一个汉语的解释以及补充,尽量将原...

【一步步学OpenGL 4】-《着色器》

教程4:着色器原文:http://ogldev.atspace.co.uk/www/tutorial04/tutorial04.html背景:从这篇教程开始,我们将使用shader着色器来实现每一个效...

【一步步学OpenGL 8】 -《缩放变换》

教程8缩放变换原文: http://ogldev.atspace.co.uk/www/tutorial08/tutorial08.html背景缩放变换非常简单,它的目的是增大或者缩小物体的尺寸。比如你...

【一步步学OpenGL 2】-《你好顶点》

你好顶点原文:http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html背景这里要第一次开始使用GLEW(the OpenGL Extensi...

【一步步学OpenGL 5】-《一致变量Uniform Variables》

教程5:一致变量原文:http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html背景在这个教程中我们将遇到一个新的shader变量:一致变量(...

关于Dll和lib的区别及作用

在学校的时候只是纯粹学习编程知识,并

一步步学OpenGL(7) - 《旋转变换》

教程7旋转变换原文: http://ogldev.atspace.co.uk/www/tutorial07/tutorial07.html背景继上个教程的平移变换之后,这里开始学习旋转变换,也就是能够...

2016-09-16-minor mistakes

I found some minor mistakes when I translate the OpenGL Tutorials 《OpenGL Step by Step》into Chinese ...

创建自己的dll和lib文件

经常使用到第三方库。比如:glut,freetype,sdl,大一点的有CEGUI,OSG等。这些库虽然是开源的,但是很多时候只是使用他们,一般不会去修改。使用就会涉及到三个东西:.h  .lib  ...
  • dizuo
  • dizuo
  • 2009-04-23 15:47
  • 5701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)