opengl 几何着色器

绘制4条线段

  1 #define GLEW_STATIC
  2 #include <GL/glew.h>
  3 #include <GLFW/glfw3.h>
  4
  5 #include "Shader.h"
  6 #include <fstream>
  7 #include <iostream>
  8 using namespace std;
  9
 10 void framebuffer_size_callback(GLFWwindow* window, int width, int height);
 11 void processInput(GLFWwindow *window);
 12
 13
 14 // settings
 15 const unsigned int SCR_WIDTH = 800;
 16 const unsigned int SCR_HEIGHT = 600;
 17
 18
 19 // timing
 20 float deltaTime = 0.0f;
 21 float lastFrame = 0.0f;
 22
 23 int main()
 24 {
 25     // glfw: initialize and configure
 26     // ------------------------------
 27     glfwInit();
 28     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
 29     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
 30     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
 31
 32 #ifdef __APPLE__
 33     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
 34 #endif
 35
 36                                                          // glfw window creation
 37                                                          // --------------------
 38     GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
 39     if (window == NULL)
 40     {
 41         std::cout << "Failed to create GLFW window" << std::endl;
 42         glfwTerminate();
 43         return -1;
 44     }
 45     glfwMakeContextCurrent(window);
 46     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
 47
 48
 49     glewExperimental = GL_TRUE;
 50     if (glewInit() != GLEW_OK)
 51     {
 52         cout << "Failed to initialize GLEW!" << endl;
 53         return -1;
 54     }
 55     // configure global opengl state
 56     // -----------------------------
 57
 58     Shader shader("E:\\C++\\High_level_GLSL\\2.1ver1.txt", "E:\\C++\\High_level_GLSL\\2.1frag1.txt",
 59         "E:\\C++\\High_level_GLSL\\2.1geo1.txt");
 60
 61     float points[] = {
 62         -0.5f, 0.5f,
 63         0.5f, 0.5f,
 64         0.5f, -0.5f,
 65         -0.5f, -0.5f
 66     };
 67
 68     /*float points[] = {
 69         -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
 70         0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
 71         0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
 72         -0.5f, -0.5f, 1.0f, 1.0f, 0.0f
 73     };*/
 74
 75     unsigned int VAO, VBO;
 76     glGenVertexArrays(1, &VAO);
 77     glGenBuffers(1, &VBO);
 78     glBindVertexArray(VAO);
 79     glBindBuffer(GL_ARRAY_BUFFER, VBO);
 80     glBufferData(GL_ARRAY_BUFFER, sizeof(points), &points, GL_STATIC_DRAW);
 81     glEnableVertexAttribArray(0);
 82     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
 83     //glEnableVertexAttribArray(1);
 84     //glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));
 85     glBindVertexArray(0);
 86
 87     while (!glfwWindowShouldClose(window))
 88     {
 89         processInput(window);
 90
 91         glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
 92         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 93
 94         shader.use();
 95         glBindVertexArray(VAO);
 96         glDrawArrays(GL_POINTS, 0, 4);
 97
 98         glfwSwapBuffers(window);
 99         glfwPollEvents();
100     }
101
102     glDeleteVertexArrays(1, &VAO);
103     glDeleteBuffers(1, &VBO);
104
105 }
106
107     void processInput(GLFWwindow *window)
108     {
109         if (glfwGetKey(window, GLFW_KEY_ENTER) == GLFW_PRESS)
110             glfwSetWindowShouldClose(window, true);
111     }
112
113     // glfw: whenever the window size changed (by OS or user resize) this callback function executes
114     // ---------------------------------------------------------------------------------------------
115     void framebuffer_size_callback(GLFWwindow* window, int width, int height)
116     {
117         // make sure the viewport matches the new window dimensions; note that width and
118         // height will be significantly larger than specified on retina displays.
119         glViewport(0, 0, width, height);
120     }
121
122     
E:\\C++\\High_level_GLSL\\2.1ver1.txt
1 #version 330 core
2 layout (location = 0) in vec2 aPos;
3
4 void main()
5 {
6     gl_Position = vec4(aPos, 0.0f, 1.0f);
7 }
E:\\C++\\High_level_GLSL\\2.1frag1.txt
1 #version 330 core
2 out vec4 FragColor;
3 void main()
4 {
5     FragColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6 }
E:\\C++\\High_level_GLSL\\2.1geo1.txt
 1 #version 330 core
 2 layout (points) in;
 3 layout (line_strip, max_vertices = 2) out;
 4
 5 void main()
 6 {
 7     gl_Position = gl_in[0].gl_Position + vec4(-0.1f, 0.0f, 0.0f, 0.0f);
 8     EmitVertex();
 9     gl_Position = gl_in[0].gl_Position + vec4(0.1f, 0.0f, 0.0f, 0.0f);
10     EmitVertex();
11
12     EndPrimitive();
13 }

Shader.h头文件,只需将链接里的#include <glad/glad.h>换成  

#define GLEW_STATIC
#include <GL/glew.h>

就行

原文地址:https://www.cnblogs.com/hi3254014978/p/9692965.html

时间: 2024-10-08 08:30:25

opengl 几何着色器的相关文章

OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-while) 跳跃(discard, return, break, continue) 6.1函数定义   着色器是由一系列全局声明和函数定义组成的.函数声明规范如下: // prototype returnType functionName (type0 arg0, type1 arg1, ...,

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节.最低存储需要通过精度修饰符来声明.典型地,精度操作必须要保留变量包含的精度存储.仅有的例外是需要大量复杂计算的内建函数,如atan(),返回值的精度低于声明的精度. 强烈建议顶点语言提供一种匹配IEEE单精度浮点数或更高精

OpenGL ES着色器语言之着色概览(官方文档)

OpenGL ES着色器语言之着色概览(官方文档第二章) 事实上,OpenGL ES着色语言是两种紧密关联的语言.这些语言用来在OpenGL ES处理管线的可编程处理器创建着色器. 在本文档中,除非另外说明,一个语言功能适用于所有语言,并且通用用法将把他们当做一个语言来看待.特定语言将指出它们的目标处理器:顶点(vertext)或片元(fragment). 任何被着色器使用的OpenGL ES状态值都会自动地被跟踪并且作用于着色器上.这个自动状态跟踪机制允许应用程序为状态管理而使用OpenGL

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情况下,变量在声明的时候可以使用等号“=”进行初始化. 用户定义类型可以使用struct,在结构体中所有变量类型都必须是OpenGL ES着色器语言定义的关键字.OpenGL ES着色语言是类型安全的,因此不支持隐式类型转换.

OpenGL ES着色器语言之操作数(官方文档第五章)

OpenGL ES着色器语言之操作数(官方文档第五章) 5.1操作数 OpenGL ES着色器语言包含如下操作符. 5.2数组下标 数组元素通过数组下标操作符([ ])进行访问.这是操作数组的唯一操作符,举个访问数组元素的例子: diffuseColor += lightIntensity[3] * NdotL; 5.3函数调用 如果一个函数有返回值,那么通常这个函数调用会用在表达式中. 5.4构造器 构造器使用函数调用语法,函数名是一个基本类型的关键字或者结构体名字,在初始化器或表达式中使用.

DirectX11 With Windows SDK--15 几何着色器初探

# 前言 从这一部分开始,感觉就像是踏入了无人深空一样,在之前初学DX11的时候,这部分内容都是基本上跳过的,现在打算重新认真地把它给拾回来. [DirectX11 With Windows SDK完整目录](http://www.cnblogs.com/X-Jun/p/9028764.html) [Github项目源码](https://github.com/MKXJun/DirectX11-With-Windows-SDK) # 几何着色器 首先用一张图来回顾一下渲染管线的各个阶段,目前为止

DirectX11 With Windows SDK--16 利用几何着色器可选的流输出阶段帮助绘制多种分形

前言 在上一章,我们知道了如何使用几何着色器来重新组装图元,比如从一个三角形分裂成三个三角形.但是为了实现更高阶的分形,我们必须要从几何着色器拿到输出的顶点.这里我们可以使用可选的流输出阶段来拿到顶点集合. 注意: 本章末尾有大量的GIF动图! DirectX11 With Windows SDK完整目录 Github项目源码 流输出阶段 现在我们知道GPU可以写入纹理(textures),例如深度/模板缓冲区以及后备缓冲区.当然,我们也可以通过渲染管线的流输出阶段让GPU将几何着色器输出的顶点

DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果

前言 上一章我们知道了如何使用几何着色器将顶点通过流输出阶段输出到绑定的顶点缓冲区.接下来我们继续利用它来实现一些新的效果,在这一章,你将了解: 实现公告板效果 Alpha-To-Coverage 对GPU资源进行读/写操作 纹理数组 实现雾效 DirectX11 With Windows SDK完整目录 Github项目源码 实现雾效 虽然这部分与几何着色器并没有什么关系,但是雾的效果在该Demo中会用到,并且前面也没有讲过这部分内容,故先在这里提出来. 有时候我们需要在游戏中模拟一些特定的天

[转载]OpenGL ES着色器语言之内建函数(官方文档第八章)

OpenGL ES着色语言为标量和向量操作定义了一套内建便利函数.有些内建函数可以用在多个类型的着色器中,有些是针对固定硬件的,所以这部分只能用在某个特定的着色器上. 内建函数基本上可以分为一下三类: (1)它们使用一些简便的方式提供必要的硬件功能,如材质贴图.这些函数单独通过着色器是无法模拟出来的. (2)它们展示了一些可以常简单的写入的繁琐操作(clamp, mix等),但是这些操作非常普遍,并且提供直接对硬件的支持.对于编译器来说,将表达式映射到复杂的装配线指令上是非常困难的. (3)它们