C++ GLSL-对象在与矩阵相乘时消失
我有一个顶点着色器:C++ GLSL-对象在与矩阵相乘时消失,c++,opengl,glsl,C++,Opengl,Glsl,我有一个顶点着色器: #version 400 layout(location=0) in vec4 vertPosition; layout(location=1) in vec2 vertUV; layout(location=2) in vec3 vertNormal; uniform mat4 MVP; out vec3 fragPosition; out vec2 fragUV; out vec3 fragNormal; void main(void){ gl_Posi
#version 400
layout(location=0) in vec4 vertPosition;
layout(location=1) in vec2 vertUV;
layout(location=2) in vec3 vertNormal;
uniform mat4 MVP;
out vec3 fragPosition;
out vec2 fragUV;
out vec3 fragNormal;
void main(void){
gl_Position = MVP * vertPosition;
fragPosition = (MVP * vertPosition).rgb;
fragUV = vertUV;
fragNormal = (MVP * vec4(vertNormal,0)).rgb;
}
只要我将vertPosition乘以MVP,要渲染的对象就会消失,即使MVP是一个单位矩阵
下面是我设置MVP的代码:
mat4 model = translate(mat4(), vec3(0,0,0));
mat4 view = translate(mat4(), vec3(0,0,-10));
mat4 proj = perspective(90.0f, (float)1280/720, 0.001f, 1000.0f);
mat4 MVP = model * view * proj;
GLint uniform_loc = glGetUniformLocation(this->_shaderID, "MVP");
glUniformMatrix4fv(uniform_loc, 1, GL_FALSE, value_ptr(matrix));
我在着色器中尝试了不同的乘法顺序和乘法。您已经获得了反转多个MVP的顺序。OpenGL矩阵乘法是列主右关联的,因此应该是
mat4 MVP = proj * view * model;
0.0001的近剪裁平面距离太小。从本质上讲,您正在将所有深度缓冲区分辨率压缩到一个非常小的范围内。使尽可能大
我不明白您为什么选择.rgb作为fragPosition和fragNormal。从示例的外观来看,您忘记了在设置统一之前设置着色器程序。尝试使用glUseProgramthis->program;这取决于在设置矩阵之前您将程序存储在何处 你从GLGeterror那里得到什么了吗?我认为在将mat4乘以它们之前,必须将vec3向上转换为vec4。不,没关系,代码在程序中,而不是GLSL中。在Vec4中包装它们顺便问一下,片段着色器中需要剪辑空间位置MVP*vertPosition做什么?从技术上讲,它不是剪辑空间,因为您截断了用于剪辑的重要W组件,因此得名,但它似乎仍然不是特别有用。片段着色器已经隐式包含屏幕空间中定义的位置gl_FragCoord,根据您使用fragPosition的目的,您可能根本不需要它。@LiessJemai:您的近剪裁平面距离也有问题。好的,我正在解决这个问题。但是这个物体消失了,即使我只是乘以一个恒等式。