最近2D转向3D,也从固定管线转到了可编程管线,有些细节的东西记录一下。

Geometry Shader

Geometry Shader从Vertex Shader中获取数据,向Fragment Shader输出数据。

Geometry Shader的布局限定符:

layout (a1) in;
layout (a2,max_vertices = ) out;

a1表示输入图元类型,可以使lines、triangles等值,这个值的所有取值可以查表,此值需要和API中Drawcall的传入的绘制类型兼容,如果这里填写lines,那么DrawCall就必须是GL_LINES或者兼容的类型,具体的兼容类型可以查表。

a2表示输出图元类型,这个类型指定了GS所有EmitVertex产生的点的链接方式,如果是triangle_strip,那么就是输出三角扇,多余的点会被自动移除。后面的max_vertices执行一次shader允许产生的最大顶点数。这个东西我在开始的时候忽略了,所以在一个图元遍历的时候,总是无法产生出3个以上的顶点。

GS的in/out/uniform和其他vs和fs一样,API创建方式也一样,只要更改类型就行了,但是GS的in如果在输入图元是多个顶点的话应该是相同名字的数组,这一点如果没加我用的A卡编译器当前版本驱动是会指出来的。其他就不知道了。

GS产生顶点使用EmitVertex()函数,产生的位置就是当前gl_Position的位置,也就是当前位置。在GS处理顶点的时候,必须要手动生成原顶点,否则下一阶段将会没有这些顶点输出。也就是如果写一个空的GS,这意味着丢弃了所有顶点。

EndPrimitive()用于中断一个图元带。这个函数的调用意味着,前面生成的所有顶点将会按照a2的指定方式生成图元带。如果剩余的点不足以生成一个图元,那些点将会被丢弃。想要生成单个的带,可以在生成一个完整的图元后就调用这个函数。比如a2=line_strip,那就可以在产生两个顶点后就中断,如此就可以产生一根直线了。

关于坐标变换,我使用GS来可视化一个模型的发现,以确保这些发现是正确的。于是我在传入这个GS的法线和顶点都是只转换到view空间的,计算完成后再统一做透视处理。

#version  core

layout (triangles) in;
layout (triangle_strip,max_vertices = ) out;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
uniform int vn;
in vec3 onormal[];
in vec3 normal[];
out vec3 normalo;
void main()
{
vec4 position;
int i; for(i=;i<gl_in.length();i++)
{
if(vn==)
{
vec3 n = normal[i];
normalo = n;
gl_Position = proj_matrix*gl_in[i].gl_Position;
EmitVertex();
}
else
{
vec3 on = onormal[i];
vec3 n = normal[i];
normalo = n;
gl_Position = proj_matrix*gl_in[i].gl_Position;
EmitVertex();
EmitVertex();
position = gl_in[i].gl_Position + *vec4(n,.f);
gl_Position = proj_matrix*position;
EmitVertex();
EndPrimitive();
}
}
EndPrimitive(); }

还有GS的输入,gl_in数组是默认输入,这个输入跟随输入类型而变化长度,这个数组的元素是顶点结构体,它的隐式声明是:

in gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
} gl_in[];

关于API:

多个物体想要正确的呈现必须开启深度测试,否则就什么也看不见了,开启深度测试必须先要位深度缓存赋初始值,一般赋值为:

glClearDepth();

开启深度测试:

glEnable(GL_DEPTH_TEST);

没帧清理深度缓存:

glClear(GL_DEPTH_BUFFER_BIT);

另外可以设置深度测试的测试等式,这个都好说。

另外,背面剔除和设置多边形渲染模式(可以渲染成线框)

glEnable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK ,GL_LINE );

OpenGL总结的更多相关文章

  1. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  3. OpenGL超级宝典笔记----渲染管线

    在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...

  4. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

  5. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  6. OpenGL shader 中关于顶点坐标值的思考

    今天工作中需要做一个事情: 在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示. 思路很简单,在vertex shader内知道顶点坐标,进行计 ...

  7. OpenGL: 纹理采样 texture sample

    Sampler (GLSL) Sampler通常是在Fragment shader(片元着色器)内定义的,这是一个uniform类型的变量,即处理不同的片元时这个变量是一致不变的.一个sampler和 ...

  8. OpenGL ES 3.0: 图元重启(Primitive restart)

    [TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...

  9. opengl 笔记(2)

    /*- * Opengl Demo Test * * Fredric : 2016-7-10 */ #include <GLUT/GLUT.h> #include <stdlib.h ...

  10. opengl 笔记(1)

    参考<opengl入门教程>.<OpenGL之坐标转换>.<OpenGL绘制管线操作细节>等资料. 复习下留个备忘:) /*- * Opengl Demo Test ...

随机推荐

  1. MariaDB 密码,新用户添加

    修改root密码1.以root身份在终端登陆(必须)2.输入 mysqladmin -u root -p password ex后面的 ex 是要设置的密码3.回车后出现 Enter password ...

  2. [转] 运维小技巧:使用ss命令代替 netstat,和netstat说再见

    [From] https://blog.csdn.net/fenglailea/article/details/51810977 ss是Socket Statistics的缩写. 顾名思义,ss命令可 ...

  3. 为什么Kafka那么快,明显领先其他mq?

    经常看到有很多Kafka的测试文章,测试结果通常都是“吊打”其他MQ.感慨它的牛B之余我觉得必要仔细分析一下它如此快速的原因.这篇文章不同于其他介绍Kafka使用或者技术实现的文章,此处我会重点解释— ...

  4. MySQL 小抄

    1. 登录 mysql - u root -pEnter Password: 2. 查询端口 mysql> show global variables like "port" ...

  5. Linux mmap 要主动释放共享内存

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...

  6. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  7. Ace教你一步一步做Android新闻客户端(五) 优化Listview

    今天写存货了 调试一些动画参数花了些时间 ,嘿嘿存货不多了就没法做教程了,今天来教大家优化listview,等下我把代码编辑下 这次代码有些多 所以我把条理给大家理清楚.思路就是把加载图片的权利交给O ...

  8. js判断文件是否存在的方法

    在做电力监控项目的时候,有一个需求就是左右布局的框架,点击左边的图形文件地址,然后去文件夹中找到文件,再在右边出现对应的图形文件,但是有些文件可能是配置的时候有问题,找不到文件,所以js需要判断,以下 ...

  9. nyoj 1192——Salvation——————【搜索】

    Salvation 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 神秘瀑布镇是一个神秘的地方,那里有吸血鬼,狼人,巫师,二重身. Klaus(吸血鬼祖先) 为了利用 ...

  10. !function()是干什么的?

    叹号后面跟函数!function和加号后面跟函数+function都是跟(function(){})();这个函数是一个意思,都是告诉浏览器自动运行这个匿名函数的,因为!+()这些符号的运算符是最高的 ...