参考:
https://stackoverflow.com/questions/6017176/gllinestipple-deprecated-in-opengl-3-1

main.cpp


/
#include "Shader.h"#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <GLFW/glfw3.h>#include <vector>
#include <string>std::string vertShader = R"(
#version 330layout (location = 0) in vec3 inPos;flat out vec3 startPos;
out vec3 vertPos;uniform mat4 u_mvp;void main()
{vec4 pos    = u_mvp * vec4(inPos, 1.0);gl_Position = pos;vertPos     = pos.xyz / pos.w;startPos    = vertPos;
}
)";std::string fragShader = R"(
#version 330flat in vec3 startPos;
in vec3 vertPos;out vec4 fragColor;uniform vec2  u_resolution;
uniform uint  u_pattern;
uniform float u_factor;void main()
{vec2  dir  = (vertPos.xy-startPos.xy) * u_resolution/2.0;float dist = length(dir);uint bit = uint(round(dist / u_factor)) & 15U;if ((u_pattern & (1U<<bit)) == 0U)discard; fragColor = vec4(1.0);
}
)";GLuint CreateVAO(std::vector<glm::vec3> &varray)
{GLuint vbo, vao;glGenBuffers(1, &vbo);glGenVertexArrays(1, &vao);glBindVertexArray(vao);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, varray.size() * sizeof(*varray.data()), varray.data(), GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);return vao;
}///
int main(void)
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);GLFWwindow *window = glfwCreateWindow( 800, 600, "dashedLine", nullptr, nullptr );if ( window == nullptr )return 0;glfwMakeContextCurrent(window);// ---------------------------------------if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return false;}Shader shader(vertShader, fragShader);GLuint nShaderProgID = shader.ID;GLint loc_mvp     = glGetUniformLocation(nShaderProgID, "u_mvp");GLint loc_res     = glGetUniformLocation(nShaderProgID, "u_resolution");GLint loc_pattern = glGetUniformLocation(nShaderProgID, "u_pattern");GLint loc_factor  = glGetUniformLocation(nShaderProgID, "u_factor");glUseProgram(nShaderProgID);GLushort pattern = 0x18ff;GLfloat  factor  = 2.0f;glUniform1ui(loc_pattern, pattern);glUniform1f(loc_factor, factor);// 矩形glm::vec3 p0(-1.0f, -1.0f, 0.0f);glm::vec3 p1(1.0f, -1.0f, 0.0f);glm::vec3 p2(1.0f, 1.0f, 0.0f);glm::vec3 p3(-1.0f, 1.0f, 0.0f);std::vector<glm::vec3> varrayRec{ p0, p1, p1, p2, p2, p3, p3, p0 };GLuint vaoRec = CreateVAO(varrayRec);// 圆形std::vector<glm::vec3> varrayCircle;for (size_t i = 0; i <= 360; i += 8){double a = i * 3.1415926 / 180.0;double c = cos(a), s = sin(a);varrayCircle.emplace_back(glm::vec3((float)c, (float)s, 0.0f));}GLuint vaoCircle = CreateVAO(varrayCircle);glm::mat4(project);int w, h;glfwGetFramebufferSize(window, &w, &h);glViewport(0, 0, w, h);float aspect = (float)w/(float)h;project = glm::ortho(-aspect, aspect, -1.0f, 1.0f, -10.0f, 10.0f);glUniform2f(loc_res, (float)w, (float)h);while (!glfwWindowShouldClose(window)){glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glm::mat4 model_view_Rec( 1.0f );model_view_Rec = glm::translate(model_view_Rec, glm::vec3(-0.6f, 0.0f, 0.0f) );model_view_Rec = glm::scale(model_view_Rec, glm::vec3(0.5f, 0.5f, 1.0f) );glm::mat4 mvpRec = project * model_view_Rec;glUniformMatrix4fv(loc_mvp, 1, GL_FALSE, glm::value_ptr(mvpRec));glBindVertexArray(vaoRec);glDrawArrays(GL_LINES, 0, (GLsizei)varrayRec.size());glm::mat4 model_view_Circle( 1.0f );model_view_Circle = glm::translate(model_view_Circle, glm::vec3(0.6f, 0.0f, 0.0f) );model_view_Circle = glm::scale(model_view_Circle, glm::vec3(0.5f, 0.5f, 1.0f) );glm::mat4 mvpCircle = project * model_view_Circle;glUniformMatrix4fv(loc_mvp, 1, GL_FALSE, glm::value_ptr(mvpCircle));glBindVertexArray(vaoCircle);glDrawArrays(GL_LINE_STRIP, 0, (GLsizei)varrayCircle.size());glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;
}


shader.h

#ifndef SHADER_H
#define SHADER_H#include <glad/glad.h>
#include <glm/glm.hpp>#include <string>
#include <fstream>
#include <sstream>
#include <iostream>class Shader
{public:unsigned int ID;// constructor generates the shader on the fly// ------------------------------------------------------------------------Shader(std::string& vertexStr, std::string& fragmentStr){// 1. retrieve the vertex/fragment source code from stringstd::string vertexCode = vertexStr;std::string fragmentCode = fragmentStr;const char* vShaderCode = vertexCode.c_str();const char * fShaderCode = fragmentCode.c_str();// 2. compile shadersunsigned int vertex, fragment;// vertex shadervertex = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertex, 1, &vShaderCode, NULL);glCompileShader(vertex);checkCompileErrors(vertex, "VERTEX");// fragment Shaderfragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment, 1, &fShaderCode, NULL);glCompileShader(fragment);checkCompileErrors(fragment, "FRAGMENT");// shader ProgramID = glCreateProgram();glAttachShader(ID, vertex);glAttachShader(ID, fragment);glLinkProgram(ID);checkCompileErrors(ID, "PROGRAM");// delete the shaders as they're linked into our program now and no longer necesseryglDeleteShader(vertex);glDeleteShader(fragment);}Shader(const char* vertexPath, const char* fragmentPath){// 1. retrieve the vertex/fragment source code from filePathstd::string vertexCode;std::string fragmentCode;std::ifstream vShaderFile;std::ifstream fShaderFile;// ensure ifstream objects can throw exceptions:vShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);fShaderFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);try {// open filesvShaderFile.open(vertexPath);fShaderFile.open(fragmentPath);std::stringstream vShaderStream, fShaderStream;// read file's buffer contents into streamsvShaderStream << vShaderFile.rdbuf();fShaderStream << fShaderFile.rdbuf();        // close file handlersvShaderFile.close();fShaderFile.close();// convert stream into stringvertexCode = vShaderStream.str();fragmentCode = fShaderStream.str();           }catch (std::ifstream::failure& e){std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ: " << e.what() << std::endl;}const char* vShaderCode = vertexCode.c_str();const char * fShaderCode = fragmentCode.c_str();// 2. compile shadersunsigned int vertex, fragment;// vertex shadervertex = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertex, 1, &vShaderCode, NULL);glCompileShader(vertex);checkCompileErrors(vertex, "VERTEX");// fragment Shaderfragment = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragment, 1, &fShaderCode, NULL);glCompileShader(fragment);checkCompileErrors(fragment, "FRAGMENT");// shader ProgramID = glCreateProgram();glAttachShader(ID, vertex);glAttachShader(ID, fragment);glLinkProgram(ID);checkCompileErrors(ID, "PROGRAM");// delete the shaders as they're linked into our program now and no longer necesseryglDeleteShader(vertex);glDeleteShader(fragment);}~Shader(){}// activate the shader// ------------------------------------------------------------------------void use() const{ glUseProgram(ID); }// utility uniform functions// ------------------------------------------------------------------------void setBool(const std::string &name, bool value) const{         glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value); }// ------------------------------------------------------------------------void setInt(const std::string &name, int value) const{ glUniform1i(glGetUniformLocation(ID, name.c_str()), value); }// ------------------------------------------------------------------------void setFloat(const std::string &name, float value) const{ glUniform1f(glGetUniformLocation(ID, name.c_str()), value); }// ------------------------------------------------------------------------void setVec2(const std::string &name, const glm::vec2 &value) const{ glUniform2fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]); }void setVec2(const std::string &name, float x, float y) const{ glUniform2f(glGetUniformLocation(ID, name.c_str()), x, y); }// ------------------------------------------------------------------------void setVec3(const std::string &name, const glm::vec3 &value) const{ glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]); }void setVec3(const std::string &name, float x, float y, float z) const{ glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z); }// ------------------------------------------------------------------------void setVec4(const std::string &name, const glm::vec4 &value) const{ glUniform4fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]); }void setVec4(const std::string &name, float x, float y, float z, float w) const{ glUniform4f(glGetUniformLocation(ID, name.c_str()), x, y, z, w); }// ------------------------------------------------------------------------void setMat2(const std::string &name, const glm::mat2 &mat) const{glUniformMatrix2fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);}// ------------------------------------------------------------------------void setMat3(const std::string &name, const glm::mat3 &mat) const{glUniformMatrix3fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);}// ------------------------------------------------------------------------void setMat4(const std::string &name, const glm::mat4 &mat) const{glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);}private:// utility function for checking shader compilation/linking errors.// ------------------------------------------------------------------------void checkCompileErrors(GLuint shader, std::string type){GLint success;GLchar infoLog[1024];if (type != "PROGRAM"){glGetShaderiv(shader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(shader, 1024, NULL, infoLog);std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;}}else{glGetProgramiv(shader, GL_LINK_STATUS, &success);if (!success){glGetProgramInfoLog(shader, 1024, NULL, infoLog);std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl;}}}
};
#endif

OpenGL随机生成线宽 线型

OpenGL 绘制点划线相关推荐

  1. 如何用 OpenGL 绘制雪花?

    作者 | 许向武 责编 | 张红月 出品 | CSDN博客 看冬奥才知道,阿勒泰不但是中国的"雪都",还是"人类滑雪起源地".这个说法是否成立,姑且不论,阿勒泰 ...

  2. 使用OpenGL绘制圆环体(Torus)

    本篇介绍一下使用OpenGL绘制圆环体的方法.程序是在C#和OpenTK环境下编译的. 代码: /// <summary> /// 绘制圆环体 /// </summary> / ...

  3. 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )

    文章目录 一.绘制三角形 二.三角形绘制顺序 1.绘制正面 2.三个点逆时针方向排列 3.三个点顺时针方向排列 4.设置点的正面方向 三.绘制多个三角形 四.相关资源 一.绘制三角形 三角形绘制即绘制 ...

  4. 【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )

    文章目录 一.绘制单个点 二.绘制多个点 三.相关资源 在上一篇博客 [OpenGL]十.OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | ...

  5. 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )

    文章目录 一.初始化 OpenGL 矩阵 1.设置投影矩阵 2.设置模型视图矩阵 二.绘制点 1.清除缓冲区 2.设置当前颜色值 3.设置绘制点的大小 4.绘制点 5.将缓冲区绘制到前台 三.部分代码 ...

  6. 【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )

    文章目录 一.OpenGL 状态机概念 二.OpenGL 矩阵概念 上一篇博客 [OpenGL]八.初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗 ...

  7. OpenGL绘制二个不同颜色的三角形的实例

    OpenGL绘制二个不同颜色的三角形 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include & ...

  8. OpenGL绘制带有索引的矩形的实例

    OpenGL绘制带有索引的矩形 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include < ...

  9. OpenGL绘制一个三角形的实例

    OpenGL绘制一个橘黄色的三角形 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include &l ...

最新文章

  1. 01背包问题:回溯法和限界分支、递归和迭代方式
  2. CentOS安装Samba服务
  3. python交通调查数据处理_python 小型交通调查后的数据处理(数车)
  4. 链栈,用链表写成的栈,源代码如下
  5. Eclipse 在开发中使用到的快捷键很实用 .
  6. Frame buffer分析 - fbmem.c【转】
  7. macOS中LaTeX报错Package fontspec Error: The font “SimHei“ cannot be found
  8. asp.net 设置div带颜色透明
  9. 戴尔服务器r330系统设置,DELL台式机330的BIOS设置中文图解
  10. 获取flickr网站上某个用户的所有图片url
  11. workbench如何截图_戴尔键盘电脑如何快捷键截屏
  12. 基于高精度单片机开发红外测温仪方案
  13. js插件 excel在线编辑插件X-Spreadsheet
  14. VMware新建OracleLinux6.5虚拟机
  15. [nrf52][SDK17] 如何修改BLE_MAC地址?
  16. 2021年茶艺师(中级)报名考试及茶艺师(中级)操作证考试
  17. vue:Failed to resolve component:xxx
  18. 求一份 2018年5月更新最新全国省市区县geojson数据(江苏)(echarts等图表可用)
  19. SVG实现超酷素描动画
  20. 算法笔记CodeUp第一至第六章刷题记录

热门文章

  1. 射频功率放大器在超声导波技术管道损伤检测研究中的应用
  2. 【单应变换】通过空间平面诱导的单应公式的理解
  3. 零中频接收机频率转换图_雷达原理雷达接收机
  4. 大便、小便与放屁 --引用
  5. 详细讲解ExpandableListView显示和查询仿QQ分组列表用户信息
  6. Android 蓝牙技术(一)- 经典蓝牙
  7. Excel图片也能一对多查找输入姓名找到所有图片
  8. java毕业生设计中文网络小说平台系统计算机源码+系统+mysql+调试部署+lw
  9. flask markdown 报错解决
  10. cocos2d-LUA逆向之修改客户端app,实时获取app解密后通信数据