本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347440


上一篇文章中已经介绍了OpenGL窗口的创建。本文接着说如何用OpenGL绘制一个三角形。

1 . 添加头文件mesh.h,代码如下:

  1. #pragma once
  2. #include <glm\glm.hpp>
  3. #include <GL\glew.h>
  4. class Vertex
  5. {
  6. public:
  7. Vertex(const glm::vec3& pos)
  8. {
  9. this->pos = pos;
  10. }
  11. protected:
  12. private:
  13. glm::vec3 pos;
  14. };
  15. class Mesh
  16. {
  17. public:
  18. Mesh(Vertex* vertices, unsigned int numVertices);
  19. void Draw();
  20. virtual ~Mesh();
  21. protected:
  22. private:
  23. Mesh(const Mesh& other);
  24. void operator=(const Mesh& other);
  25. enum
  26. {
  27. POSITION_VB,
  28. NUM_BUFFERS
  29. };
  30. GLuint m_vertexArrayObject;
  31. GLuint m_vertexArrayBuffers[NUM_BUFFERS];
  32. unsigned int m_drawCount;
  33. };

2 . 添加类mesh.cpp,代码如下:

  1. #include "mesh.h"
  2. Mesh::Mesh(Vertex* vertices, unsigned int numVertices)
  3. {
  4. m_drawCount = numVertices;
  5. glGenVertexArrays(1, &m_vertexArrayObject);
  6. glBindVertexArray(m_vertexArrayObject);
  7. glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
  8. glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]);
  9. glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW);
  10. glEnableVertexAttribArray(0);
  11. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
  12. glBindVertexArray(0);
  13. }
  14. Mesh::~Mesh()
  15. {
  16. glDeleteVertexArrays(1, &m_vertexArrayObject);
  17. }
  18. void Mesh::Draw()
  19. {
  20. glBindVertexArray(m_vertexArrayObject);
  21. glDrawArrays(GL_TRIANGLES, 0, m_drawCount);
  22. glBindVertexArray(0);
  23. }

3 . 修改主类main.cpp,代码如下:

  1. #include <GL\glew.h>
  2. #include "display.h"
  3. #include "mesh.h"
  4. int main(int argc, char** argv)
  5. {
  6. // 设置窗体大小和标题
  7. Display display(400, 300, "hello world!");
  8. // 设置三角形顶点
  9. Vertex vertices[] = { Vertex(glm::vec3(-0.5, -0.5, 0)), Vertex(glm::vec3(0, 0.5, 0)), Vertex(glm::vec3(0.5, -0.5, 0)), };
  10. // 生成网格
  11. Mesh mesh(vertices, sizeof(vertices) / sizeof(vertices[0]));
  12. while (!display.IsClosed())
  13. {
  14. display.Clear(0.0f, 1.0f, 0.0f, 1.0f);
  15. // 绘制三角形
  16. mesh.Draw();
  17. display.Update();// 刷新
  18. }
  19. return 0;
  20. }

本文整理自YouTube视频教程#3.5 Intro to Modern OpenGL Tutorial: Meshes


声明:本文欢迎转载和分享,但是请尊重作者的劳动成果,转载分享时请注明出处:http://www.cnblogs.com/davidsheh/p/5471689.html 。同时,码字实在不易,如果你觉得笔者分享的笔记对你有点用处,请顺手点击下方的推荐,谢谢!

[Modern OpenGL系列(四)]在OpenGL中使用Shader的更多相关文章

  1. sed修炼系列(四):sed中的疑难杂症

    本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N" ...

  2. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  3. 解读Unity中的CG编写Shader系列四(unity中的圆角矩形shader)

    转自 http://www.itnose.net/detail/6097625.html 上篇文章中我们掌握了表面剔除和剪裁模式 这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做 ...

  4. go微服务系列(四) - http api中引入protobuf

    1. protobuf相关依赖安装 2. 改造之前的client 2.1 新建proto文件 2.2 运行protoc命令生成go文件 2.3 然后把原来的map修改成具体的类型就可以了 3. 处理j ...

  5. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  6. 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程

    在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...

  7. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  8. [转]用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口

    原文链接: 1.用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口 2.Windows MFC 两个OpenGL窗口显示与线程RC问题

  9. GLSL 在OpenGL中向shader传递信息【转】

    http://blog.csdn.net/hgl868/article/details/7872219 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为shade ...

  10. 【GLSL教程】(三)在OpenGL中向shader传递信息 【转】

    http://blog.csdn.net/racehorse/article/details/6634830 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为sh ...

随机推荐

  1. 写自己的Socket框架(三)

    在通信写完了以后,应用层接收到Socket抛上来的byte[],这个时候对于实际的写逻辑的开发者来说,这样的数据并不友好,我们就需要在应用层统一一个包的规则(应用层协议),处理完以后,然后再传给实际的 ...

  2. ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...

  3. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  4. [APUE]不用fcntl实现dup2函数功能

    dup2的函数定义为: #include <unistd.h> int dup2(int src_fd, int new_fd); 自己实现dup2函数有几个关键点: 1,检查给定的源fd ...

  5. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...

  6. Livecoding.tv2.5发布,增加“用户搜索引擎”功能,方便用户找到匹配的程序员

    近日,在Livecoding.tv最新发布的博客中,介绍了该平台2.5版的一系列新功能,其中的User Discovery Engine(用户搜索引擎)受到大家的欢迎.使用该引擎,可以很方便地查找在L ...

  7. socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...

  8. .NET Core采用的全新配置系统[7]: 将配置保存在数据库中

    我们在<聊聊默认支持的各种配置源>和<深入了解三种针对文件(JSON.XML与INI)的配置源>对配置模型中默认提供的各种ConfigurationSource进行了深入详尽的 ...

  9. React.render和reactDom.render的区别

    刚开始学习react.js.发现网上的资料,有些是写着react.render,有些写着reactDom.render.觉得很奇怪就查阅了一下资料.解释如下: 这个是react最新版api,也就是0. ...

  10. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...