Geometry Shaders(几何造型Shader)

2023-11-10 04:59

本文主要是介绍Geometry Shaders(几何造型Shader),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

周一到周五,每天一篇,北京时间早上7点准时更新~,中英文对照,一边学编程一边弹吉他,做一个奇葩码农!

请不要怀疑翻译是否有问题,我们的翻译工程师是蓝翔毕业的呢!

The geometry shader is logically the last shader stage in the front end(逻辑上来说,geometry shader是整个渲染管线的最后一个shader阶段), sitting after the vertex and tessellation stages and before the rasterizer(在vertex和tessellation之后,光栅化之前). The geometry shader runs once per primitive and has access to all of the input vertex data for all of the vertices that make up the primitive being processed(每个geometry shader一次处理一个图元,每次处理的时候,可以访问该图元的所有点的信息). The geometry shader is also unique among the shader stages in that it is able to increase or reduce the amount of data flowing through the pipeline in a programmatic way(geometry shader也是非常独特的,它可以通过编程的方式增加或者减少输出的图元). Tessellation shaders can also increase or decrease the amount of work in the pipeline, but only implicitly by setting the tessellation levelfor the patch(虽然tessellation也可以增加或者减少图元,但是只能隐式的通过一些设置去做). Geometry shaders, in contrast, include two functions—EmitVertex() and EndPrimitive()(相反,geometry shader有专门的函数去显示的增加或者减少发送给光栅化的图元的个数)— that explicitly produce vertices that are sent to primitive assembly and rasterization

Another unique feature of geometry shaders is that they can change the primitive mode mid-pipeline(另一个独特点就是geometry shader可以在中途改变图元的模式). For example, they can take triangles as input and produce a bunch of points or lines as output(比如他们可以以三角形作为输入图元,最后却输出点或者线), or even create triangles from independent points(甚至是通过输入的点创建更多三角形). An example geometry shader is shown in Listing 3.9.(Listing3.9显示了一个geometry shader的样本)

#version 450 core
layout (triangles) in;
layout (points, max_vertices = 3) out;
void main(void)
{int i;for (i = 0; i < gl_in.length(); i++){gl_Position = gl_in[i].gl_Position;EmitVertex();}
}

Listing 3.9: Our first geometry shader

The shader shown in Listing 3.9 acts as another simple pass-through shader that converts triangles into points so that we can see their vertices(Listing 3.9显示了一个简单的geometry shader,它简单的将三角形转换成点). The first layout qualifier indicates that the geometry shader is expecting to see triangles as its input(第一个修饰符表示geometry shader希望得到三角形作为输入). The second layout qualifier tells OpenGL that the geometry shader will produce points and that the maximum number of points that each shader will produce will be three(第二个修饰符说明的是geometry shader输出的是点,并且每次最多输出3个点). In the main function, a loop runs through all of the members of the gl_in array, which is determined by calling its .length() function(在主函数里,有一个循环,会遍历gl_in数组,它的大小可以通过length接口获取)

We actually know that the length of the array will be three because we are processing triangles and every triangle has three vertices(其实我们已经知道数组大小是3了,因为我们输入的数据是三角形,并且三角形有三个点). The outputs of the geometry shader are again similar to those of a vertex shader(这些输出数据再一次变得更vertex shader的输出数据一样了). In particular, we write to gl_Position to set the position of the resulting vertex(特别是,我们使用gl_Position去设置顶点的位置). Next, we call EmitVertex(), which produces a vertex at the output of the geometry shader(然后我们调用EmitVertex来输出一个点). Geometry shaders automatically call EndPrimitive() at the end of your shader, so calling this function explicitly is not necessary in this example(geometry shader会自动调用EndPrimitive,所以你不必在shader中显示的去调用它). As a result of running this shader, three vertices will be produced and rendered as points(运行之后,将会有三个点被渲染出来)

By inserting this geometry shader into our simple one tessellated triangle example, we obtain the output shown in Figure 3.2(在把这个geometry shader塞到我们的渲染管线了之后,我们将会得到图3.2的结果). To create this image, we set the point size to 5.0 by calling glPointSize()(为了得到这个图片,我们把点的大小设置成了5.0,从而使得点能够大一点,且能够容易被看到). This makes the points large and highly visible

本日的翻译就到这里,明天见,拜拜~~

第一时间获取最新桥段,请关注东汉书院以及图形之心公众号

东汉书院,等你来玩哦

这篇关于Geometry Shaders(几何造型Shader)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/380502

相关文章

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

poj 3304 几何

题目大意:给出n条线段两个端点的坐标,问所有线段投影到一条直线上,如果这些所有投影至少相交于一点就输出Yes!,否则输出No!。 解题思路:如果存在这样的直线,过投影相交点(或投影相交区域中的点)作直线的垂线,该垂线(也是直线)必定与每条线段相交,问题转化为问是否存在一条直线和所有线段相交。 若存在一条直线与所有线段相交,此时该直线必定经过这些线段的某两个端点,所以枚举任意两个端点即可。

POJ 2318 几何 POJ 2398

给出0 , 1 , 2 ... n 个盒子, 和m个点, 统计每个盒子里面的点的个数。 const double eps = 1e-10 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;}struct Point{double x , y

poj 2653 几何

按顺序给一系列的线段,问最终哪些线段处在顶端(俯视图是完整的)。 const double eps = 1e-10 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;}struct Point{double x , y ;Point(){}Po

三维布尔运算对不规范几何数据的兼容处理

1.前言 上一篇文章谈过八叉树布尔运算,对于规范几何数据的情况是没有问题的。 在实际情况中,由于几何数据来源不一,处理和生成方式不一,我们无法保证进行布尔运算的几何数据都是规范的,对于不规范情况有时候也有需求,这就需要兼容不规范数据情况,当然这种兼容不是一味的让步,而是对于存在有限的不规范数据的兼容处理。 2.原始数据示例 下图是一个大坝模型和之上要对其进行布尔运算的立方体。 大坝模型由

CF#284 (Div. 2) C.(几何规律)

题目链接:http://codeforces.com/contest/499/problem/C 解题思路: 把两个点的坐标分别带入方程组,如果最后两个值相乘为负,即异号,计数器++。其中有一个有趣的现象,从A到B的最短步数,可以变化为求A和B之间夹了多少条直线,那么最后只要求出直线数,即可求出最小步数。 如果一条直线夹在A和B中间,那么把A和B的坐标带入后,所得值相乘一定为负。数据很

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些