+BIT祝威+悄悄在此留下版了个权的信息说：

+BIT祝威+悄悄在此留下版了个权的信息说：

# 问题

+BIT祝威+悄悄在此留下版了个权的信息说：

# 下载

+BIT祝威+悄悄在此留下版了个权的信息说：

# 原理

+BIT祝威+悄悄在此留下版了个权的信息说：

 1 #version 410 core
2
3 //输入类型为三角形
4 layout (triangles) in;
5 //输出的是三角形带
6 layout (triangle_strip, max_vertices = 11) out;
7
8 uniform mat4 modelMatrix;
9 uniform mat4 viewMatrix;
10 uniform mat4 projectionMatrix;
11
12 uniform float normalLength = 0.5f;
13
14 in VS_GS_VERTEX
15 {
16     vec3 normal;
17 } vertex_in[];
18
19 out GS_FS_VERTEX
20 {
21     vec3 color;
22 } vertex_out;
23
24 void main(void)
25 {
26     int i;
27     //先输出模型本身
28     for (i = 0; i < gl_in.length(); i++) {
29         vertex_out.color = vertex_in[i].normal;
30         vec4 position = gl_in[i].gl_Position;
31         gl_Position = projectionMatrix * viewMatrix * (modelMatrix * position);
32         EmitVertex();
33     }
34     EndPrimitive();
35
36     //生成顶点的法线（一个法线用一个三棱柱表示）
37     for (i = 0; i < gl_in.length(); i++) {//我的理解：此处gl_in.length()为3
38         //法线颜色为白色
39         vertex_out.color = vec3(1, 1, 1);
40
41          //获取模型的顶点位置（针尖）
42         vec4 position = gl_in[i].gl_Position;
43         //获取模型的法线（针头）位置
44         vec4 target = position + vertex_in[i].normal * normalLength;
45         {
46             vec4 v0 = position;
47             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v0);
48             EmitVertex();//生成一个三棱柱顶点
49
50             vec4 v1 = target;
51             if (target.x > position.x) { v1.x += normalLength / 30.0f; }
52             else { v1.x -= normalLength / 10.0f; }
53             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v1);
54             EmitVertex();//生成一个三棱柱顶点
55
56             vec4 v2 = position;
57             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v2);
58             EmitVertex();//生成一个三棱柱顶点
59
60             vec4 v3 = target;
61             if (target.y > position.y) { v3.y += normalLength / 30.0f; }
62             else { v3.y -= normalLength / 10.0f; }
63             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v3);
64             EmitVertex();//生成一个三棱柱顶点
65
66             vec4 v4 = position;
67             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v4);
68             EmitVertex();//生成一个三棱柱顶点
69
70             vec4 v5 = target;
71             if (target.z > position.z) { v5.z += normalLength / 30.0f; }
72             else { v5.z -= normalLength / 10.0f; }
73             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v5);
74             EmitVertex();//生成一个三棱柱顶点
75
76             vec4 v6 = position;
77             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v6);
78             EmitVertex();//生成一个三棱柱顶点
79
80             vec4 v7 = target;
81             if (target.x > position.x) { v7.x += normalLength / 30.0f; }
82             else { v7.x -= normalLength / 10.0f; }
83             gl_Position = projectionMatrix * viewMatrix * (modelMatrix * v7);
84             EmitVertex();//生成一个三棱柱顶点
85
86         }
87
88         EndPrimitive();//依据上面的8个顶点，为此顶点的法线生成一个三棱柱
89     }
90 }

## in\out类型变量

1 in VS_GS_VERTEX
2 {
3     vec3 normal;
4 } vertex_in[];

1 out GS_FS_VERTEX
2 {
3     vec3 color;
4 } vertex_out;
+BIT祝威+悄悄在此留下版了个权的信息说：

## gl_Position

+BIT祝威+悄悄在此留下版了个权的信息说：

# 填坑

+BIT祝威+悄悄在此留下版了个权的信息说：

# 总结

## 2016-02-16

### 解决法线不稳定的问题

1 in VS_GS_VERTEX
2 {
3     vec3 normal;
4 } vertex_in[];

1 out GS_FS_VERTEX
2 {
3     vec3 color;
4 } vertex_out;

1         class VS_GS_VERTEX
2         {
3             public vec3 normal;//必须是public的字段
4         }
5         [In]
6         VS_GS_VERTEX[] vertex_in;
1         class GS_FS_VERTEX
2         {
3             public vec3 color;//必须是public的字段
4         }
5         [Out]
6         GS_FS_VERTEX vertex_out;

### 初始值的自动转化

1         [Uniform]
2         float normalLength = 0.5f;

1 uniform float normalLength = 0.5;

### debug

+BIT祝威+悄悄在此留下版了个权的信息说：
posted @ 2016-02-16 01:09 BIT祝威 阅读(...) 评论(...) 编辑 收藏