Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL-对象在与矩阵相乘时消失_C++_Opengl_Glsl - Fatal编程技术网

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:您的近剪裁平面距离也有问题。好的,我正在解决这个问题。但是这个物体消失了,即使我只是乘以一个恒等式。