学到了OpenGL中的用户裁剪和前剪切,记录下gl_ClipDistance和gl_CullDiatance的用法。
gl_ClipDiatance:输出的裁剪距离将和图元进行线性插值,插值距离小于0,则图元部分将剪切掉。
gl_CullDiatance:如果图元的所有顶点对于平面返回了负数的裁减距离值,那么图元需要被裁减。
用OpenGL编程指南中的代码修改测试下:

#include <iostream>
#include "vgl.h"
#include "LoadShaders.h"
#include "vmath.h"using namespace std;struct Vertex
{GLubyte color[4];GLfloat position[3];
};Vertex Verts[9] = { { { 255,0,  0,  255 },   { 0.6f,  0.9f,  0.0f  } },{ { 0,  255,0,  255 },    { -0.9f, -0.9f, 0.0f  } },{ { 0,  0,  255,255 },    { 0.9f,  -0.9f, 0.0f  } },{ { 255,255,255,255 },    { 0.0f,  0.8f,  -0.2f } },{ { 255,255,255,255 },    { -0.4f, 0.0f,  -0.2f } },{ { 255,255,255,255 },    { 0.4f,  0.0f,  -0.2f } },{ { 255,255,255,255 },    { 0.3f,  0.0f,  -0.2f } },{ { 255,255,255,255 },    { -0.4f, -0.8f, -0.2f } },{ { 255,255,255,255 },    { 0.4f,  -0.8f, -0.2f } }
};GLuint Program = 0;GLuint vert;
GLuint vbo;void Init()
{ShaderInfo si[] = { { GL_VERTEX_SHADER, "Chpater05.vert" },{ GL_FRAGMENT_SHADER, "Chapter05.frag" },{ GL_NONE, NULL } };Program = LoadShaders(si);glGenVertexArrays(1, &vert);glBindVertexArray(vert);glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(Verts), Verts, GL_STATIC_DRAW);glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), BUFFER_OFFSET(0));glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(Verts->color)));glEnableVertexAttribArray(1);glClearColor(0.2f, 0.1f, 0.3f, 1.0f);glUseProgram(Program);glUniform4f(glGetUniformLocation(Program, "Plane"), 0.0, 0.0, 0.0, 0.0);
}void Display()
{glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(vert);glEnable(GL_CLIP_DISTANCE0);glDrawArrays(GL_TRIANGLES, 0, 9);glutSwapBuffers();glutPostRedisplay();Sleep(30);
}int main(int argc, char*argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE |GLUT_STENCIL);glutInitWindowSize(400, 400);glutInitContextVersion(4, 3);glutInitContextProfile(GLUT_CORE_PROFILE);glutCreateWindow("Test OpenGL Chapter 04");if (glewInit()){cout << "Unable to Initialize GLEW." << endl;return 1;}Init();glutDisplayFunc(Display);glutMainLoop();return 0;
}

顶点着色器:

#version 450 corelayout(location = 0) in vec4 vColor;
layout(location = 1) in vec4 vPos;
uniform vec4 Plane;
out vec4 color;void main()
{gl_Position = vPos;color = vColor;
//  gl_ClipDistance[0] = Plane[3] - Plane[0]*vPos.x - Plane[1]*vPos.y - Plane[2]*vPos.z;
//  gl_CullDistance[0] = Plane[3] - Plane[0]*vPos.x - Plane[1]*vPos.y - Plane[2]*vPos.z;
}

片元着色器:

#version 450 corein vec4 color;
out vec4 fColor;void main()
{fColor = color;
}

正常情况下:

打开gl_CullDistance赋值代码注释,裁剪面设置成:

glUniform4f(glGetUniformLocation(Program, "Plane"), 0.0, 0.0, 1.0, -0.1);


最大的变色三角形消失了,这是因为这个三角形三个顶点的Z值都是0,计算后三个顶点的gl_CullDistance值都小于0

打开gl_ClipDistance的注释,注释掉gl_CullDistance,裁剪面设置成:

glUniform4f(glGetUniformLocation(Program, "Plane"), 0.0, 1.0, 1.0, 0.1);

OpenGL:gl_ClipDistance和gl_CullDiatance相关推荐

  1. OpenGL基础41:几何着色器

    在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在<OpenGL基础3:渲染管线>这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果 一.最简单 ...

  2. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  3. [OpenGL] 几何着色器

    reference:https://www.khronos.org/opengl/wiki/Geometry_Shader 几何着色器(GS)是一个使用GLSL编写的处理图元生成的shader程序,它 ...

  4. 【OpenGL】蓝宝书第十一章——高级着色器应用

    目录 高级顶点着色器 在顶点着色器中进行物理模拟 几何着色器 直通几何着色器 在应用程序中使用几何着色器 在几何着色器中丢弃几何图形 在几何着色器中修改几何图形 在几何着色器中生成几何图形 在几何着色 ...

  5. OpenGL 4.0的Tessellation Shader(细分曲面着色器)

    细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:Rendering Pipeline Overview - Op ...

  6. OpenGL学习笔记(十)-几何着色器-实例化

    参考网址:LearnOpenGL 中文版 4.7 几何着色器 4.7.1 基本概念 1.顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点,顶点发送到下一 ...

  7. 【OpenGL】蓝宝书第十二章——高级几何图形管理

    目录 查询功能--收集OpenGL管线相关信息 准备查询 发出查询 取回查询结果 使用查询结果 让OpenGL决定 测量执行命令所需时间 在GPU内存中存储数据 使用缓冲区存储顶点数据 在缓冲区中保存 ...

  8. 计算机图形学与opengl C++版 学习笔记 第14章 其他技术

    目录 14.1 雾 14.2 复合.混合.透明度 14.3 用户定义剪裁平面 14.4 3D纹理 14.5 噪声 14.6 噪声应用--大理石 14.8 噪声应用--云 14.9 噪声应用--特殊效果 ...

  9. OpenCL,OpenGL编译

    OpenCL,OpenGL编译 TVM已经支持多个硬件后端:CPU,GPU,移动设备等-添加了另一个后端:OpenGL / WebGL. OpenGL / WebGL能够在没有安装CUDA的环境中利用 ...

最新文章

  1. Datawhale组队学习周报(第040周)
  2. 【原创】浅说windows下的中断请求级IRQL
  3. 【游戏开发】基于VS2017的OpenGL开发环境搭建
  4. 条形图坐标轴_手把手教你用Excel绘图 | 双轴簇状条形图
  5. 转载:掩膜矩阵操作数学解释(权重表,锐化)
  6. 老生常谈session,cookie的区别,安全性
  7. 在Linux中head命令,Linux 中 head 命令实例
  8. java子类怎么编译_java – 无法编译从基类实现抽象方法的子类
  9. c/s 给 服务器上传文件(c/s和b/s互传文件)
  10. 13.罗马数字转整数-LeetCode
  11. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
  12. Hadoop中MR程序的几种提交运行模式
  13. 在Windows中安装NodeJS的正确方法
  14. arch linux安装和dwm窗口管理器安装
  15. 百度文库会员制度悄然上线
  16. Linux防蓝光(Redshift)
  17. 透明网桥的自学习算法
  18. jena 查询 java_Jena搭建SPARQL查询RDF数据
  19. Docker的安装以及常用的一些命令
  20. 诗词创作[3] 问春

热门文章

  1. 大小写字母转换 (15分)
  2. 修改/忘记数据库密码
  3. vue项目通讯录_vue 自定义组件实现通讯录功能
  4. 奥迪Q5更换初装变速箱油教程
  5. criterial查询(2014-05-29 03:51)续-----Example
  6. Pycharm 安装 github copilot 报错:failed to initiate the github login process please try again
  7. 关于QQ登录出现非官方应用 错误码100044的解决办法
  8. win7原版安装版系统
  9. 【MATLAB】基础01
  10. 日常bug记录——mybatis传值为null