OpenGL学习——绘制矩形
接下来稍微扩展一步,绘制矩形,即两个拼在一起的三角形。
引入一个概念, EBO Element Buffer Object 元素缓冲对象,
EBO用于存放描述“顶点绘制顺序”的对象。
外注:创建VS工程配置:
project properties
*.h dir:
D:\code\OpenGL\glfw\prebuilt\include;D:\code\OpenGL\glew\prebuilt\include;
*.lib dir:
D:\code\OpenGL\glfw\prebuilt\lib;D:\code\OpenGL\glew\prebuilt\lib;
linked lib name:
opengl32.lib;libglew32d.lib;glfw3.lib;
加入SOIL后:
*.h dir:
D:\code\OpenGL\glfw\prebuilt\include;D:\code\OpenGL\glew\prebuilt\include;D:\code\OpenGL\soil\prebuilt\include;
*.lib dir:
D:\code\OpenGL\glfw\prebuilt\lib;D:\code\OpenGL\glew\prebuilt\lib;D:\code\OpenGL\soil\prebuilt\lib;
linked lib name:
opengl32.lib;libglew32d.lib;glfw3.lib;SOIL.lib;
顶点数组对象(VAO)绑定会存储元素缓冲对象(EBO)解绑,就是说在绘制循环里只关心VAO即可。
元素缓冲对象(EBO)的创建和绑定同顶点缓冲对象(VBO),只是绑定目标换成 GL_ELEMENT_ARRAY_BUFFER 。
Wireframe Mode 线框模式,在绘制循环里设置,可控制画线和添充。
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // GL_FILL set the wireframe mode
加入元素缓冲对象(EBO)后,绘制函数改用 glDrawElements
好了,上图上代码:
main.cpp同三角形绘制。
头文件 Rectangles.h
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#include <iostream>
#include <sstream> class Rectangles{ public:
Rectangles(); ~Rectangles(); public:
void init(); void draw(); private:
//create vertex shader
void createVertexShader(); //create fragment shader
void createFragmentShader(); //create shader program
void createShaderProgram(); //get vertex shader source code
std::string getVertexShaderSrc(); //get fragment shader source code
std::string getFragmentShaderSrc(); private:
GLuint VAO; //define VAO, vertex array object
GLuint vertexShader;
GLuint fragmentShader;
GLuint shaderProgram; };
实现类 Rectangles.cpp
#include "Rectangles.h" Rectangles::Rectangles(){
} Rectangles::~Rectangles(){
} void Rectangles::init(){
// x,y,z opengl coordinates, the vertex data, three 3d point in normalized device coordinates
GLfloat vertexs[] = {
0.5f, 0.5f, 0.0f, // 0-right up
0.5f, -0.5f, 0.0f, // 1-right down
-0.5f, 0.5f, 0.0f, // 2-left up
-0.5f, -0.5f, 0.0f, // 3-left down
};
// vertex draw index array
GLuint indexs[] = {
, , ,
, , ,
};
//define VAO, vertex array object
//GLuint VAO;
glGenVertexArrays(, &VAO);
glBindVertexArray(VAO); // bind vertex array object
//define VBO, vertex buffer object
GLuint VBO;
glGenBuffers(, &VBO); // gen buffer object
glBindBuffer(GL_ARRAY_BUFFER, VBO); // bind buffer to the target
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs), vertexs, GL_STATIC_DRAW); // copy vertex data to VBO
//define EBO, element buffer object
GLuint EBO;
glGenBuffers(, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexs), indexs, GL_STATIC_DRAW);
//set vertex attribute point
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, * sizeof(GLfloat), (GLvoid*));
glEnableVertexAttribArray();
glBindVertexArray();//unbind vertex array object //create shader program
this->createShaderProgram();
} void Rectangles::draw(){
//use shader programs
glUseProgram(shaderProgram); //draw the Rectangles
glBindVertexArray(VAO);
//glDrawArrays(GL_TRIANGLES, 0, 3);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // GL_LINE set the wireframe mode
glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_INT, );
glBindVertexArray();
} void Rectangles::createVertexShader(){
//compile vertex shader source
std::string vertexShaderStr = this->getVertexShaderSrc();
const char *vertexShaderSrc = vertexShaderStr.c_str();
std::cout << "vertexShaderSrc:\n" << vertexShaderSrc;
//GLuint vertexShader; // shader object
vertexShader = glCreateShader(GL_VERTEX_SHADER); // create vertex shader object
glShaderSource(vertexShader, , &vertexShaderSrc, NULL); // shader source attach to shader object
glCompileShader(vertexShader); // compile shader
//compile result check
GLint success;
GLchar infoLog[];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success){
glGetShaderInfoLog(vertexShader, , NULL, infoLog);
std::cout << "vertex shader source compile failed...\n" << infoLog << std::endl;
std::cout << vertexShaderSrc;
}
} void Rectangles::createFragmentShader(){
//compile fragment shader source
std::string fragmentShaderStr = this->getFragmentShaderSrc();
const char *fragmentShaderSrc = fragmentShaderStr.c_str();
std::cout << "\n\nfragmentShaderSrc:\n" << fragmentShaderSrc;
//GLuint fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, , &fragmentShaderSrc, NULL);
glCompileShader(fragmentShader);
} void Rectangles::createShaderProgram(){
this->createVertexShader();
this->createFragmentShader();
if (vertexShader == NULL || fragmentShader == NULL){
return;
}
//shader program, link vertex shader object and fragment shader object
//GLuint shaderProgram;
shaderProgram = glCreateProgram(); // create shader program
glAttachShader(shaderProgram, vertexShader); // attach vertex shader
glAttachShader(shaderProgram, fragmentShader); // attach fragment shader
glLinkProgram(shaderProgram); // linking
//check link result
GLint success;
GLchar infoLog[];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success){
glGetProgramInfoLog(shaderProgram, , NULL, infoLog);
std::cout << "shader program linking failed...\n" << infoLog << std::endl;
return;
}
//delete vertex shader object and fragment shader object
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
} std::string Rectangles::getVertexShaderSrc(){
std::string vertexShaderStr =
"#version 330 core\n"
"layout (location = 0) in vec3 pos; "
"void main () {"
" gl_Position = vec4(pos, 1.0);"
"}";
return vertexShaderStr;
} std::string Rectangles::getFragmentShaderSrc(){
std::string fragmentShaderStr =
"#version 330 core\n"
"out vec4 color; "
"void main () {"
" color = vec4(1.0f, 0.1f, 0.1f, 1.0f);"
"}";
return fragmentShaderStr;
}
运行结果:
OpenGL学习——绘制矩形的更多相关文章
- OpenGL学习-------绘制简单的几何图形
本次课程所要讲的是绘制简单的几何图形,在实际绘制之前,让我们先熟悉一些概念. 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的 ...
- [HTML5 Canvas学习]绘制矩形
1.使用strokeRect和fillRect方法绘制矩形 a.strokeRect是绘制一个不填充的矩形 b.fillRect是绘制一个填充的矩形 代码: <script> var ca ...
- OpenGL学习——绘制第一个三角形
终于把三角形绘制出来了,首先一些关键概念.操作. Vertex Data 顶点数据 VBO Vertex Buffer Objects 顶点缓冲对象 VA ...
- OpenGL学习进程(10)第七课:四边形绘制与动画基础
本节是OpenGL学习的第七个课时,下面以四边形为例介绍绘制OpenGL动画的相关知识: (1)绘制几种不同的四边形: 1)四边形(GL_QUADS) OpenGL的GL_QUADS图 ...
- OpenGL学习进程(8)第六课:点、边和图形(三)绘制图形
本节是OpenGL学习的第六个课时,下面介绍OpenGL图形的相关知识: (1)多边形的概念: 多边形是由多条线段首尾相连而形成的闭合区域.OpenGL规定,一个多边形必须是一个“凸多边形”. ...
- OpenGL学习进程(4)第二课:绘制图形
本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形: (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) ...
- OpenGL学习进程(11)第八课:颜色绘制的详解
本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿. (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. R ...
- canvas学习总结六:绘制矩形
在第三章中(canvas学习总结三:绘制路径-线段)我们提高Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRec ...
- OpenGL编程(二)绘制矩形
上次只是创建了一个简单的窗口,把背景颜色修改为蓝色(默认是黑色),并没有向窗口添加任何图形.这次在上次代码的基础上往窗口中添加一个矩形,设置矩形的颜色,大小等. 1.添加矩形 在(参考上次代码)ren ...
随机推荐
- Vue中组件间传值常用的几种方式
版本说明: vue-cli:3.0 一.父子组件间传值 1.props/$emit -父组件==>>子组件: 子组件中通过定义props接收父组件中通过v-bind绑定的数据 父组件代码 ...
- go中字符类型的使用小结
示例 // 字符类型的用法 package main import ( "fmt" "unsafe" ) func main() { // 未指定类型并赋值字符 ...
- while循环与getopts处理
- 回收子进程——wait/waitpid 与 信号机制
孤儿/僵尸进程——回收子进程 参考博客:https://blog.csdn.net/qq_35396127/article/details/78725915 :https://www.cnblogs. ...
- CSS 3D 的魅力
作者 | 子慕大诗人 来源 | www.cnblogs.com/1wen/p/9064011.html 前言: 最近玩了玩用css来构建3D效果,写了几个demo,所以博客总结一下. 在阅读 ...
- OpenLayers学习笔记(十二)— 飞机速度矢量线预测(二)
根据计算公式实现预测线 作者:狐狸家的鱼 GitHub:八至 之前有一篇博客简单写了一个模拟demo,根据物体当前的速度和方向预测多少时间后所在的位置,具体计算是参考<(译)计算距离.方位以及更 ...
- hibernate简单连接mysql数据库配置
使用hibernate连接mysql数据库 1:项目搭建好之后,在lib包中添加必要的jar包,和mysql数据库驱动jar包: jar包可以在hibernate的下载包(hibernate3.3.2 ...
- 阿里云安装Cloudera Manager(草稿)
选择三台同一局域网的阿里云服务器 最初使用阿里云.京东云.百度云的三台不同的服务器,遇到一些问题,没有解决,公网速度也没有保障,还是选择同一局域网的服务器吧 CM有三种不同的安装方式: 通过 Clou ...
- 【JavaWeb项目】一个众筹网站的开发(一)架构搭建
本项目是@尚硅谷相关视频的记录. 本项目使用Maven构建,工程架构如下图所示: 一.公司的公共父工程和工具类包 1.父工程 每个公司都有自己的父工程 父工程作用:对公司使用的jar包进行统一管理,别 ...
- 【leetcode】662. Maximum Width of Binary Tree
题目如下: Given a binary tree, write a function to get the maximum width of the given tree. The width of ...