openGL系列文章目录

文章目录

  • openGL系列文章目录
  • 前言
  • 一、OpenGL 中的曲面细分
  • 二、代码
    • 1.主程序c++
  • 效果

前言

术语Tessellation(镶嵌)是指一大类设计活动,通常是指在平坦的表面上,用各种几何
形状的瓷砖相邻排列以形成图案。它的目的可以是艺术性的或实用性的,很多例子可以追
溯到几千年前[TS16]。
在3D 图形学中,Tessellation 指的是有点不同的东西(曲面细分),但显然是由它的经典
对应物(镶嵌)启发而成的。在这里,曲面细分指的是生成并且操控大量三角形以渲染复
杂的形状和表面,尤其是使用硬件进行渲染。曲面细分是OpenGL 核心近期才增加的新功
能,在2010 年的4.0 版本中出现。①

一、OpenGL 中的曲面细分

OpenGL 对硬件曲面细分的支持,通过3 个管线阶段提供:
(1)曲面细分控制着色器;
(2)曲面细分器;
(3)曲面细分评估着色器。
第(1)和第(3)阶段是可编程的;而中间的第(2)阶段不是。为了使用曲面细分,
程序员通常会提供控制着色器和评估着色器。
曲面细分器(其全名是曲面细分图元生成器,或TPG)是硬件支持的引擎,可以生成固
定的三角形网格。②控制着色器允许我们配置曲面细分器要构建什么样的三角形网格。然后,
评估着色器允许我们以各种方式操控网格。然后,被操控过的三角形网格,会作为通过管
线前进的顶点的源数据。回想一下,在管线上,曲面细分着色器位于顶点着色器和几
何着色器阶段之间。
让我们从一个简单的应用程序开始,该应用程序只使用曲面细分器创建顶点的三角形网
格,然后在不进行任何操作的情况下显示它。为此,我们需要以下模块。
(1)C++/OpenGL 应用程序:
创建一个摄像机和相关的MVP 矩阵,视图(v)和投影(p)矩阵确定摄像机朝向,模
型(m)矩阵可用于修改网格的位置和方向。
(2)顶点着色器:
在这个例子中基本上什么都不做,顶点将在曲面细分器中生成。
(3)曲面细分控制着色器:
指定曲面细分器要构建的网格。
(4)曲面细分评估着色器:
将MVP 矩阵应用于网格中的顶点。
(5)片段着色器:
只需为每个像素输出固定颜色。
程序12.1 显示了整个应用程序的代码。即使像这样的简单示例也相当复杂,因此许多代
码元素都需要解释。请注意,这是我们第一次使用除顶点和片段着色器之外的组件构建
GLSL 渲染程序。因此,我们实现了createShaderProgram()的4 参数重载版本。

二、代码

1.主程序c++

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <SOIL2\soil2.h>
#include <string>
#include <iostream>
#include <fstream>
#include <glm\gtc\type_ptr.hpp> // glm::value_ptr
#include <glm\gtc\matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
#include "Utils.h"
using namespace std;float toRadians(float degrees) { return (degrees * 2.0f * 3.14159f) / 360.0f; }#define numVAOs 1//-------------------------------------------Utils util = Utils();
float cameraX, cameraY, cameraZ;
float terLocX, terLocY, terLocZ;
GLuint renderingProgram;
GLuint vao[numVAOs];// variable allocation for display
GLuint mvpLoc;
int width, height;
float aspect;
glm::mat4 pMat, vMat, mMat, mvpMat;float tessInner = 30.0f;
float tessOuter = 20.0f;void init(GLFWwindow* window) {renderingProgram = Utils::createShaderProgram("vertShader.glsl", "tessCShader.glsl", "tessEShader.glsl", "fragShader.glsl");cameraX = 0.5f; cameraY = -0.5f; cameraZ = 2.0f;terLocX = 0.0f; terLocY = 0.0f; terLocZ = 0.0f;glfwGetFramebufferSize(window, &width, &height);aspect = (float)width / (float)height;pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);glGenVertexArrays(numVAOs, vao);glBindVertexArray(vao[0]);
}void display(GLFWwindow* window, double currentTime) {glClear(GL_DEPTH_BUFFER_BIT);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(renderingProgram);vMat = glm::translate(glm::mat4(1.0f), glm::vec3(-cameraX, -cameraY, -cameraZ));mMat = glm::translate(glm::mat4(1.0f), glm::vec3(terLocX, terLocY, terLocZ));mMat = glm::rotate(mMat, toRadians(35.0f), glm::vec3(1.0f, 0.0f, 0.0f));mvpMat = pMat * vMat * mMat;mvpLoc = glGetUniformLocation(renderingProgram, "mvp_matrix");glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, glm::value_ptr(mvpMat));glFrontFace(GL_CCW);glPatchParameteri(GL_PATCH_VERTICES, 1);glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);  // FILL or LINEglDrawArrays(GL_PATCHES, 0, 1);
}void window_size_callback(GLFWwindow* win, int newWidth, int newHeight) {aspect = (float)newWidth / (float)newHeight;glViewport(0, 0, newWidth, newHeight);pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);
}int main(void) {if (!glfwInit()) { exit(EXIT_FAILURE); }glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);GLFWwindow* window = glfwCreateWindow(800, 800, "Chapter12 - program1", NULL, NULL);glfwMakeContextCurrent(window);if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }glfwSwapInterval(1);glfwSetWindowSizeCallback(window, window_size_callback);init(window);while (!glfwWindowShouldClose(window)) {display(window, glfwGetTime());glfwSwapBuffers(window);glfwPollEvents();}glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);
}

## 2.着色器
1.顶点着色器```cpp
#version 430uniform mat4 mvp_matrix;void main(void)
{
}

2.片元着色器

#version 430out vec4 color;
uniform mat4 mvp_matrix;void main(void)
{color = vec4(1.0, 1.0, 0.0, 1.0);
}

3.曲面细分着色器

#version 430uniform mat4 mvp_matrix;
layout (vertices = 1) out;void main(void)
{   gl_TessLevelOuter[0] = 6;gl_TessLevelOuter[2] = 6;gl_TessLevelOuter[1] = 6;gl_TessLevelOuter[3] = 6;gl_TessLevelInner[0] = 12;gl_TessLevelInner[1] = 12;
}
#version 430layout (quads, equal_spacing, ccw) in;uniform mat4 mvp_matrix;void main (void)
{float u = gl_TessCoord.x;float v = gl_TessCoord.y;gl_Position = mvp_matrix * vec4(u,0,v,1);
}

效果

openGL曲面细分相关推荐

  1. [OpenGL] 曲面细分特性实践

    参考资料: https://www.nvidia.cn/object/tessellation_cn.html https://www.opengl.org/wiki/Tessellation 背景 ...

  2. OpenGL Tessellation细分曲面的实例

    OpenGL Tessellation细分曲面的实例 先上图,再解答. 正常显示,细分之前 按下M键,细分之后 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示,细分之前 按下M键,细分之后 ...

  3. openGL贝塞尔曲面细分

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.贝塞尔曲面细分原理 二.代码 1.主程序c++ 效果 前言 现在让我们扩展我们的程序,使它将我们简单的矩形网格转换为贝塞尔曲面. ...

  4. 【一步步学OpenGL 31】 -《PN(Point-Normal)三角形曲面细分》

    教程 31 PN(Point-Normal)三角形曲面细分 原文: http://ogldev.atspace.co.uk/www/tutorial31/tutorial31.html CSDN完整版 ...

  5. OpenGL中的曲面细分和几何着色器

    [摘要]本文我们先介绍OpenGL中的曲面细分的一些基本概念,然后给两个例子说明不得不用这项技术的理由. 曲面细分是OpenGL 4.0之后才定义的功能,使用之前请确认你的显卡驱动支持OpenGL4. ...

  6. Surface Shaders with DX11 / OpenGL Core Tessellation 表面着色的曲面细分 - Unity Shader Reference 系列5

    Surface Shaders with DX11 / OpenGL Core Tessellation DX11/OpenGL核心下表面着色器的曲面细分 本文档主要是对Unity官方手册的个人理解与 ...

  7. OpenGL深入探索——曲面细分

    转载自:曲面细分[对翻译欠妥的地方进行了修正,增加了程序运行结果图,并进行补充说明] 原文链接:英文原文​​​​​ 背景 曲面细分( Tessellation )是 OpenGL4.x 中的一个令人兴 ...

  8. java nurbs几何库_OpenGL超级宝典笔记——NURBS与曲面细分

    NURBS 贝塞尔曲线的缺点是当我们增加很多控制点的时候,曲线变得不可控,其连续性会变差差.如果控制点很多(高阶曲线),当我们调整一个控制点的位置,对整个曲线的影响是很大的.要获得更高级的控制,可以使 ...

  9. 使用Canvas + Path和“曲面细分”算法实现钢笔笔锋效果

    本文用于在无法获取压感的设备上实现书法效果,因此所有的书写效果的笔触粗细变化,均是通过速率进行确认.最后实现效果如下(不会书法,只能让大家体会一下效果),代码基于之前的文章在安卓中结合使用GLSurf ...

最新文章

  1. linux端口找进程,Linux查看端口、进程情况及kill进程的方法
  2. 什么?超过60%的开发者都开始从Java 8 升级到 Java 11了?
  3. 升级进度卡住_升级 iOS 系统时卡住怎么办?
  4. PURE DORM IS GREAT
  5. 华为mate9云闪付功能_洗尽铅华:盘点华为那些深藏blue的手机
  6. 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1
  7. PHP设计模式--数据访问对象模式
  8. 常见的无线传感器数据采集传输系统的三种组网
  9. 远程计算机怎么安装软件安装,轻松一步把电脑上的软件远程安装到电视上!
  10. x86-64函数调用参数传递
  11. AR技术介绍(Located in Android)
  12. 微信公众号php支付设置回调,php微信公众号支付讲解(JSAPI)
  13. php 快递打印设置,让ecshop批量打印快递单修改方法
  14. 常用开发工具及常用DOS命令
  15. 初学音视频(一)-RGB和YUV格式分析
  16. 棋类游戏-五子棋小游戏
  17. 智能、精准、节能丨极海APM32F103RCT7 LED车灯应用方案
  18. 关于Spark Steaming中的Processing Time/Total Delay/Processing Delay
  19. 卸载xmanager失败导致后续安装失败,打开软件一直提示xmanager 5.msi找不到
  20. JavaScript详解原型和原型链

热门文章

  1. 【课程笔记】计算机体系结构复习笔记
  2. BT源代码学习心得(八):跟踪服务器(Tracker)的代码分析(用户请求的实际处理) - 转贴自 wolfenstein (NeverSayNever)
  3. java 跨 module 引入包不成功问题
  4. C++11特性《 右值引用-<完美转发>、lambda表达式》
  5. 关于页面请求发起后,通过F12查看到,被挂起页面中stalled花费很长时间问题的追查...
  6. Efficient Heterogeneous Collaborative Filtering without Negative Sampling for Recommendation (2020)
  7. 【嵌入式开发】Raspberry Pi 树莓派性能测试
  8. 基于lora模块智能井盖解决方案
  9. 井盖识别yolov5
  10. spss度量 名义 有序