最近在给一个球体写几何着色器,遇到了一个奇怪的bug
原来的代码:
#version 330 core
layout (triangles) in;
layout (line_strip, max_vertices = 128) out;
in gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
} gl_in[];
uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;
uniform vec3 center;
uniform float elevation;
uniform float lod_f;
uniform float vert_count;
uniform sampler2D bumpMap;
in vec3 _uv[];
in vec3 _normal[];
in vec3 _position[];
out vec3 uv;
out vec3 normal;
out vec3 position;
out float test;
vec3 worldPos_01;
vec3 worldPos_02;
vec3 uv_01;
vec3 uv_02;
struct pt
{
vec3 world_pos;
vec3 uv_coord;
};
pt getPoint(float coeff1, float coeff2)
{
pt o;
o.world_pos = _position[0] + worldPos_01 * coeff1 + worldPos_02 * coeff2;
o.uv_coord = _uv[0] + uv_01 * coeff1 + uv_02 * coeff2;
return o;
}
void emit(pt emt)
{
gl_Position = projection * view * model * vec4(emt.world_pos, 1.0);
uv = emt.uv_coord;
normal = normalize(emt.world_pos);
position = emt.world_pos;
EmitVertex();
}
void main()
{
float lod = lod_f;
worldPos_01 = _position[1] - _position[0];
worldPos_02 = _position[2] - _position[0];
uv_01 = _uv[1] - _uv[0];
uv_02 = _uv[2] - _uv[0];
pt points[128];
float index;
index = 0.0;
for(float i = 0.0; i <= lod + .1f; i++)
{
for(float j = 0.0; j <= i + .1f; j++)
{
vec2 gr = mix(vec2(i / lod, 0.0), vec2(0.0, i / lod), i == 0.0f ? 1.0f : j / i);
points[int(index)] = getPoint(gr.x, gr.y);
index ++;
}
}
float count = 20.0;
for(float q = 0.0; q < count; q++)
{
emit(points[int(q)]);
}
//test = lod_f;
//emit(points[1]);
//emit(getPoint(0.0f, 0.5f));
//emit(getPoint(0.5f, 0.0f));
EndPrimitive();
}
然后将
float count = 20.0;
改为
float count = vert_count;
的时候画面就失去了所有的输出
利用test变量我可以确认vert_count这个uniform是被成功地,正确地传递到了着色器里面。
这里是出了什么问题?
附上图片:
改之前(float count = 20.0;)