OpenGL:gl_ClipDistance和gl_CullDiatance
学到了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相关推荐
- OpenGL基础41:几何着色器
在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在<OpenGL基础3:渲染管线>这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果 一.最简单 ...
- 第二十二章 opengl之高级OpenGL(几何着色器)
OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...
- [OpenGL] 几何着色器
reference:https://www.khronos.org/opengl/wiki/Geometry_Shader 几何着色器(GS)是一个使用GLSL编写的处理图元生成的shader程序,它 ...
- 【OpenGL】蓝宝书第十一章——高级着色器应用
目录 高级顶点着色器 在顶点着色器中进行物理模拟 几何着色器 直通几何着色器 在应用程序中使用几何着色器 在几何着色器中丢弃几何图形 在几何着色器中修改几何图形 在几何着色器中生成几何图形 在几何着色 ...
- OpenGL 4.0的Tessellation Shader(细分曲面着色器)
细分曲面着色器(Tessellation Shader)处于顶点着色器阶段的下一个阶段,我们可以看以下链接的OpenGL渲染流水线的图:Rendering Pipeline Overview - Op ...
- OpenGL学习笔记(十)-几何着色器-实例化
参考网址:LearnOpenGL 中文版 4.7 几何着色器 4.7.1 基本概念 1.顶点和片段着色器之间有一个可选的几何着色器,几何着色器的输入是一个图元(如点或三角形)的一组顶点,顶点发送到下一 ...
- 【OpenGL】蓝宝书第十二章——高级几何图形管理
目录 查询功能--收集OpenGL管线相关信息 准备查询 发出查询 取回查询结果 使用查询结果 让OpenGL决定 测量执行命令所需时间 在GPU内存中存储数据 使用缓冲区存储顶点数据 在缓冲区中保存 ...
- 计算机图形学与opengl C++版 学习笔记 第14章 其他技术
目录 14.1 雾 14.2 复合.混合.透明度 14.3 用户定义剪裁平面 14.4 3D纹理 14.5 噪声 14.6 噪声应用--大理石 14.8 噪声应用--云 14.9 噪声应用--特殊效果 ...
- OpenCL,OpenGL编译
OpenCL,OpenGL编译 TVM已经支持多个硬件后端:CPU,GPU,移动设备等-添加了另一个后端:OpenGL / WebGL. OpenGL / WebGL能够在没有安装CUDA的环境中利用 ...
最新文章
- Datawhale组队学习周报(第040周)
- 【原创】浅说windows下的中断请求级IRQL
- 【游戏开发】基于VS2017的OpenGL开发环境搭建
- 条形图坐标轴_手把手教你用Excel绘图 | 双轴簇状条形图
- 转载:掩膜矩阵操作数学解释(权重表,锐化)
- 老生常谈session,cookie的区别,安全性
- 在Linux中head命令,Linux 中 head 命令实例
- java子类怎么编译_java – 无法编译从基类实现抽象方法的子类
- c/s 给 服务器上传文件(c/s和b/s互传文件)
- 13.罗马数字转整数-LeetCode
- stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结
- Hadoop中MR程序的几种提交运行模式
- 在Windows中安装NodeJS的正确方法
- arch linux安装和dwm窗口管理器安装
- 百度文库会员制度悄然上线
- Linux防蓝光(Redshift)
- 透明网桥的自学习算法
- jena 查询 java_Jena搭建SPARQL查询RDF数据
- Docker的安装以及常用的一些命令
- 诗词创作[3] 问春
热门文章
- 大小写字母转换 (15分)
- 修改/忘记数据库密码
- vue项目通讯录_vue 自定义组件实现通讯录功能
- 奥迪Q5更换初装变速箱油教程
- criterial查询(2014-05-29 03:51)续-----Example
- Pycharm 安装 github copilot 报错:failed to initiate the github login process please try again
- 关于QQ登录出现非官方应用 错误码100044的解决办法
- win7原版安装版系统
- 【MATLAB】基础01
- 日常bug记录——mybatis传值为null