Tessellation Shader的GLSL入门实现: 平面
2013-05-22 11:06
861 查看
此文续/article/7834425.html
这次来看一看如何细分一个平面(quads)
对于quads细分算法而言,需要传递6个细分参数:4个Outer和2个Inner。每个参数控制的细分如下图所示。
out1:控制四边形左边、外侧的细分数量。上图为1.
out2:控制四边形下边、外侧的细分数量。上图为2.
out3:控制四边形右边、外侧的细分数量。上图为3.
out4:控制四边形上边、外侧的细分数量。上图为4.
out1:控制四边形横向、内侧的细分数量。上图为5.
out1:控制四边形纵向、外侧的细分数量。上图为6.
Vertex Shader和Fragment Shader与之前文章一样,什么都不用干。现在看看TE 和TS shader。
Tessellation Control Shader:
Tessellation Evaluation Shader:
示例代码和讲解也可以从OpengGL Shading Language Cook Book中找到。
这次来看一看如何细分一个平面(quads)
对于quads细分算法而言,需要传递6个细分参数:4个Outer和2个Inner。每个参数控制的细分如下图所示。
out1:控制四边形左边、外侧的细分数量。上图为1.
out2:控制四边形下边、外侧的细分数量。上图为2.
out3:控制四边形右边、外侧的细分数量。上图为3.
out4:控制四边形上边、外侧的细分数量。上图为4.
out1:控制四边形横向、内侧的细分数量。上图为5.
out1:控制四边形纵向、外侧的细分数量。上图为6.
Vertex Shader和Fragment Shader与之前文章一样,什么都不用干。现在看看TE 和TS shader。
Tessellation Control Shader:
#version 400 layout( vertices=4 ) out; uniform int Outer0; uniform int Outer1; uniform int Outer2; uniform int Outer3; uniform int Inner0; uniform int Inner1; void main() { // Pass along the vertex position unmodified gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; gl_TessLevelOuter[0] = float(Outer0); gl_TessLevelOuter[1] = float(Outer1); gl_TessLevelOuter[2] = float(Outer2); gl_TessLevelOuter[3] = float(Outer3); gl_TessLevelInner[0] = float(Inner0); gl_TessLevelInner[1] = float(Inner1); }这里就是设置6个细分参数。已经解释过。注意的是在代码中参数标号我从0开始。
Tessellation Evaluation Shader:
#version 400 layout( quads, equal_spacing, ccw ) in; uniform mat4 ModelViewProjectionMatrix; void main() { float u = gl_TessCoord.x; float v = gl_TessCoord.y; vec4 p0 = gl_in[0].gl_Position; vec4 p1 = gl_in[1].gl_Position; vec4 p2 = gl_in[2].gl_Position; vec4 p3 = gl_in[3].gl_Position; // Linear interpolation gl_Position = p0 * (1-u) * (1-v) + p1 * u * (1-v) + p3 * v * (1-u) + p2 * u * v; // Transform to clip coordinates gl_Position = ModelViewProjectionMatrix * gl_Position; }注意这里使用了经典的四边形插值算法,即已知4个顶点,根据gl_TessCoord中的u,v参数插值计算对应的点坐标。
示例代码和讲解也可以从OpengGL Shading Language Cook Book中找到。
相关文章推荐
- Tessellation Shader的GLSL入门实现: 曲线
- GLSL Tessellation Shader的编程入门介绍
- Shader特效——“水墨和泡沫”的实现【GLSL】
- Shader特效——实现“放大镜/缩小镜”【GLSL】
- Shader特效——实现简单的“FishEye”【GLSL】
- osg通过glsl实现一个平面的水效果(法线贴图) 【转】
- <unity shader入门精要> - unity shader 中实现漫反射光照模型
- Shader特效——“Distance Estimation 距离估计”的实现 【GLSL】
- Shader特效——“素描 Pencil Sketch”的实现【GLSL】
- OpenGL ES入门09-GLSL实现常见特效 [转]
- Shader特效——“水彩画”的实现【GLSL】
- Shader特效——“翻页”的实现 【GLSL】
- Shader特效——“Bilateral Filter”的实现 【GLSL】
- Shader特效——“Simple 3D Raymarch”的实现 【GLSL】
- Shader特效——“径向模糊”的实现 【GLSL】
- Shader特效——“Barrel Blur”的实现 【GLSL】
- Shader学习笔记,通过GLSL实现(一)
- Shader特效——"Floyd Steinberg 抖动” 的实现 【OpenCV】【GLSL】
- Unity Shader入门精要笔记(九):Unity 的基础光照——漫反射的实现
- Shader特效——实现“火苗”【GLSL】