首页 > 其他分享 >OpenGL之DrawTriangle

OpenGL之DrawTriangle

时间:2023-08-03 13:22:20浏览次数:35  
标签:DrawTriangle OpenGL 0.0 0.5 vertexShader 顶点 着色器

  1 /* 第一步:引入相应的库 */
  2 #include <iostream>
  3 using namespace std;
  4 
  5 #define GLEW_STATIC    
  6 #include <GL/glew.h>    
  7 #include <GLFW/glfw3.h> 
  8 
  9 
 10 /* 第二步:编写顶点位置 */
 11 GLfloat vertices_1[] =
 12 {
 13      0.0f,  0.5f, 0.0f,        // 上顶点
 14     -0.5f, -0.5f, 0.0f,        // 左顶点
 15      0.5f, -0.5f, 0.0f,        // 右顶点
 16 };
 17 
 18 
 19 /* 第三步:编写顶点着色器 */
 20 const GLchar* vertexCode_1 = "#version 330 core\n"        // 3.30版本
 21 "layout(location = 0) in vec3 position_1;\n"            // 三个浮点数vector向量表示位置 position变量名
 22 "void main()\n"
 23 "{\n"
 24 "gl_Position = vec4(position_1, 1.0f);\n"                // 核心函数(位置信息赋值)
 25 "}\n";
 26 
 27 
 28 /* 第四步:编写片元着色器(也称片段着色器) */
 29 const GLchar* fragmentCode_1 = "#version 330 core\n"    // 版本信息
 30 "out vec4 FragColor_1;\n"                                // 输出是四个浮点数构成的一个向量 RGB+aerfa
 31 "void main()\n"
 32 "{\n"
 33 "FragColor_1 = vec4(0.5f, 0.75f, 0.25f, 1.0f);\n"
 34 "}\n";
 35 
 36 const static GLint WIDTH = 800, HEIGHT = 600;
 37 
 38 // DrawArray 、 VAO 这两个要重点理解,其他只要知道大致模块功能就行了。
 39 
 40 int main()
 41 {
 42     glfwInit();
 43     GLFWwindow* window_1 = glfwCreateWindow(WIDTH, HEIGHT, "Learn OpenGL Triangle test", nullptr, nullptr);
 44 
 45     int screenWidth_1, screenHeight_1;
 46     glfwGetFramebufferSize(window_1, &screenWidth_1, &screenHeight_1);
 47     glfwMakeContextCurrent(window_1);
 48     glewInit();
 49 
 50     //
 51     GLint flag;                                                                      // 用于判断编译是否成功
 52     GLchar infoLog[512];                                                          // 512个字符
 53 
 54     /* 第三步:编写顶点着色器 */
 55     GLuint vertexShader_1 = glCreateShader(GL_VERTEX_SHADER);                      // 创建顶点着色器对象
 56     glShaderSource (vertexShader_1, 1, &vertexCode_1, NULL);                      // 将顶点着色器的内容传进来
 57     glCompileShader(vertexShader_1);                                              // 编译顶点着色器    
 58     glGetShaderiv  (vertexShader_1, GL_COMPILE_STATUS, &flag);                    // 获取编译状态
 59     if (!flag)                                                                      
 60     {                                                                              
 61         glGetShaderInfoLog(vertexShader_1, 512, NULL, infoLog);                   // 缓冲池  
 62         cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << endl;
 63     }
 64 
 65     /* 第四步:编写片元着色器(也称片段着色器) */
 66     GLuint fragmentShader_1 = glCreateShader(GL_FRAGMENT_SHADER);                  // 创建片元着色器对象
 67     glShaderSource (fragmentShader_1, 1, &fragmentCode_1, NULL);                  // 将顶点着色器的内容传进来
 68     glCompileShader(fragmentShader_1);                                              // 编译顶点着色器
 69     glGetShaderiv  (fragmentShader_1, GL_COMPILE_STATUS, &flag);                  // 获取编译状态
 70     if (!flag)                                                                      
 71     {                                                                              
 72         glGetShaderInfoLog(fragmentShader_1, 512, NULL, infoLog);                  // 缓冲池  
 73         cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << endl;
 74     }
 75 
 76 
 77     /* 第五步:创建着色器程序 */
 78     GLuint shaderProgram_1 = glCreateProgram();
 79     glAttachShader(shaderProgram_1, vertexShader_1);
 80     glAttachShader(shaderProgram_1, fragmentShader_1);
 81     glLinkProgram (shaderProgram_1);
 82     glGetProgramiv(shaderProgram_1, GL_LINK_STATUS, &flag);
 83     if (!flag)
 84     {
 85         glGetProgramInfoLog(shaderProgram_1, 512, NULL, infoLog);
 86         cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << endl;
 87     }
 88     glDeleteShader(vertexShader_1);
 89     glDeleteShader(fragmentShader_1);
 90 
 91 
 92     /* 第七步:设置顶点缓冲对象(VBO) + 第八步:设置顶点数组对象(VAO)  */
 93     GLuint VAO, VBO;                                                                    // 它俩是成对出现的
 94     glGenVertexArrays(1, &VAO);
 95     glGenBuffers     (1, &VBO);
 96     glBindVertexArray(VAO);
 97     glBindBuffer     (GL_ARRAY_BUFFER, VBO);                                            // 从显卡中划分一个空间出来
 98     glBufferData     (GL_ARRAY_BUFFER, sizeof(vertices_1), vertices_1, GL_STATIC_DRAW);    // GL_STATIC_DRAW:静态的画图(频繁地读)
 99 
100 
101     /* 第六步:设置链接顶点属性 */
102     glVertexAttribPointer    (0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
103     glEnableVertexAttribArray(0);
104 
105     // draw loop 画图循环
106     while (!glfwWindowShouldClose(window_1))
107     {
108         glViewport    (0, 0, screenWidth_1, screenHeight_1);
109         glfwPollEvents();
110         glClearColor  (0.0f, 0.0f, 1.0f, 1.0f);
111         glClear       (GL_COLOR_BUFFER_BIT);
112 
113         /*  第九步:绘制三角形 */
114         glUseProgram     (shaderProgram_1);        // 渲染调用着色器程序
115         glBindVertexArray(VAO);                    // 绑定 VAO
116         glDrawArrays     (GL_TRIANGLES, 0, 3);    // 画三角形  从第0个顶点开始 一共画3次        
117         glBindVertexArray(0);                    // 解绑定        
118 
119         glfwSwapBuffers(window_1);
120     }
121 
122     glDeleteVertexArrays(1, &VAO);
123     glDeleteBuffers(1, &VBO);
124     glDeleteProgram(shaderProgram_1);
125 
126     glfwTerminate();
127     return 0;
128 }

 

标签:DrawTriangle,OpenGL,0.0,0.5,vertexShader,顶点,着色器
From: https://www.cnblogs.com/sansuiwantong/p/17603064.html

相关文章

  • Linux 下的 OpenGL 之路(九):天空盒、反射和折射
    前言搞定了天空盒,才算是真正完成了场景的搭建,以后再要进行什么样的图形学测试,都可以在这个场景下进行。比如后面的反射、折射就是这样的例子。写完这篇,我决定暂时结束这个系列。主要是因为我太懒了,居然拖拖拉拉拖了两年。其实可以探索的内容还有很多,比如阴影啊、HDR啊、辉光啊、......
  • OpenGL入门——浅谈OpenGL
    OpenGL入门了很多次,但是一旦踏出一段时间,就又啥也不懂,从头开始。以前只是需要用的时候草草学一下怎么用,会套用就行,没让自己停下来认真思考消化......短时间看效率高,长时间看效率低,因为每次使用都得重新搜索学习。所以想在再次入门的时候记录点东西,整理一下自己的思绪,以后有时间......
  • 搭建opengl环境
    转载自:https://www.cnblogs.com/ls-33/p/6595818.html 开始学习opengl啦,练习用的编辑器是codeblocks。首先当然是要清楚如何使用codeblocks创建一个opengl项目了。首先必须先引用opengl的库glut,网上百度下载一个完整的glut.下载下来的glut包后解压然后进行以下步骤:将glut......
  • OpenGL在QT中的管理
    一、设计思路1.用例图管理 2.困惑点:(1)在程序编写中,为什么主程序的Shader可以关联到model类中的数据。解决:在加载数据方面,利用VBO、VAO等,已经将数据通过处理推到GPU上。二、代码实现GLHeader.h#pragmaonce#include<QOpenGLShaderProgram>#include......
  • Fedora 38 搭建OpenGL开发环境
    我的是GLFW+GLAD的方案,与LearnOpenGLCN的教程所使用的方案一致。这个教程参考了这篇文章Linux下OpenGL环境搭建(glfw)安装GLFW首先安装GLFW编译所需的依赖sudodnfbuild-depglfw然后去官网下载GLFW源码,把源码解压,在内新建一个文件夹mkdirbuildcdbuildcmake../make......
  • OpenGL环境配置 和 测试代码(GLEW/GLFW VS2019)
    1.配置 2.测试代码:2.1 在黑板色的窗口上画一个三角形1#include<iostream>23//GLEW4#defineGLEW_STATIC5#include<GL/glew.h>67//GLFW8#include<GLFW/glfw3.h>91011//Functionprototypes12voidkey_callback(GLFWw......
  • OpenGL不够用?为何还要开发Vulkan?
    相信不少朋友和我一样有这样的疑问既然已经有广泛应用的OpenGL图形接口,为什么Khronos还要花费精力重新开发一套Vulkan图形API接口呢?查询相关资料后,总结为一句话为了更高的性能、更低的驱动程序开销。对于许多图形开发者来说,OpenGL是一个非常熟悉和广泛使用的图形API接口。然而......
  • OpenGL 环境搭建(VS2019)
    1.GLFW下载:https://sourceforge.net/projects/glfw/官网:https://www.glfw.org/download.html(可能登录不了)下载后解压glfw-3.3.8.bin.WIN32.zip将include和lib-vc2019配置到VS的工程内需要的lib:openGL32.lib ---不要忘了glfw3.lib测试代码:#include<GLFW/glfw3.......
  • OpenGL 初识
    1.能干什么 2.各种库关系  ......
  • 【OpenGL修行】点线面模式设置
    文章目录点点的大小切换线线的宽窄设置虚线绘制多边形多边形正反绘制&反转多边形表面剔除多边形表面镂空通过初始化数组设置镂空样式通过读取bmp文件设置镂空样式点点的大小切换通过glPointSize()函数即可实现点的大小控制,我画了两个大小不同的点,还是挺明显的。voiddisplay1(){......