几何体着色器计算的线在摄影机移动时消失
Geometry shader calculated lines disappear on camera move
我使用几何体着色器绘制顶点法线。除了当我移动相机时,一些线条部分消失之外,一切都如预期的那样显示出来。首先,我认为这是由于截锥体的大小,但我在场景中有比这个更大的其他对象,画得很好。
移动前
移动后
如果有人能给我任何关于如何消除这种线条消失的影响的建议,我会非常感激
下面是我的几何着色器的代码
#version 330 core
layout (triangles) in;
layout (line_strip, max_vertices = 6) out;
in Data{
vec4 position;
vec4 t_position;
vec4 normal;
vec2 texCoord;
vec4 color;
mat4 mvp;
mat4 view;
mat4 mv;
} received[];
out Data{
vec4 color;
vec2 uv;
vec4 normal;
vec2 texCoord;
mat4 view;
} gdata;
const float MAGNITUDE = 1.5f;
void GenerateLine(int index) {
const vec4 green = vec4(0.0f, 1.0f, 0.0f, 1.0f);
const vec4 blue = vec4(0.0f, 0.0f, 1.0f, 1.0f);
gl_Position = received[index].t_position;
//gdata.color = received[index].color;
gdata.color = green;
EmitVertex();
gl_Position = received[index].t_position + received[index].normal * MAGNITUDE;
//gdata.color = received[index].color;
gdata.color = blue;
EmitVertex();
EndPrimitive();
}
void main() {
GenerateLine(0); // First vertex normal
GenerateLine(1); // Second vertex normal
GenerateLine(2); // Third vertex normal
}
顶点着色器
#version 330
layout(location = 0) in vec3 Position;
layout(location = 1) in vec2 TexCoord;
layout(location = 2) in vec3 Normal;
out Data{
vec4 position;
vec4 t_position;
vec4 normal;
vec2 texCoord;
vec4 color;
mat4 mvp;
mat4 view;
mat4 mv;
} vdata;
//MVP
uniform mat4 model;
uniform mat4 projection;
uniform mat4 view;
void main() {
vdata.position = vec4(Position, 1.0f);
vdata.normal = view * model * vec4(Normal, 0.0);
vdata.texCoord = TexCoord;
vdata.view = view;
vec4 modelColor = vec4(0.8f, 0.8f, 0.8f, 1.0f);
vdata.color = modelColor;
vdata.mvp = projection * view * model;
vdata.mv = view * model;
vdata.t_position = vdata.mvp * vdata.position;
gl_Position = vdata.t_position;
};
参考伊利亚16年5月18日22:53 的回答
我最初的m_zNear等于0.1,但当切换到1.0时,线条停止消失。我不完全确定为什么会这样。如果有人知道,请分享
消失的线条是关于深度缓冲区剪裁的。顶点被投影(与MVP矩阵相乘),然后在几何体着色器(GS)中投影后更改顶点位置。GS中的这些变化导致z值落在透视划分中的归一化设备坐标(NDC)之外。对于较大的zNear
值,投影的z值较小,因此不会落在NDC之外。尽管如果GS中CCD_ 2的值足够大,则即使具有更大的CCD_。解决此问题的一个选项是在GS中进行投影。
如果其他人遇到此问题,解决方案如下:
glm::perspective(45.0f, m_aspectRatio, m_zNear, m_zFar);
我最初的m_zNear等于0.1,但当切换到1.0时,线条停止消失。我不完全确定为什么会这样。如果有人知道,请分享。
你试过用谷歌搜索zFar-zNear吗?给你。
或者至少试着在谷歌上搜索一下神奇的帮助glm::透视(…)函数?
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 移动二维数组中的字符
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 安全到标准:移动会员?
- 几何体着色器计算的线在摄影机移动时消失