2014-01-13 84 views
1

我有了这个顶点着色器乘以当对象消失。GLSL通过矩阵

这里就是我设置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)); 

我尝试了不同的乘法订单和着色器multiplicating。

+0

你从GLGeterror()中得到了什么吗?我认为你必须在将'mat4'乘以它们之前将'vec3()'上传到'vec4()'。绝对不要忘记,代码在你的编程中不在你的GLSL中。你在'vec4()' – zero298

+0

中包装它们顺便说一句,你需要在片段着色器中使用剪辑空间位置('MVP * vertPosition')?从技术上讲,它不是剪辑空间,因为你切掉了重要的'W'组件(用于裁剪,因此名称),但它似乎仍然不是特别有用。碎片着色器已经隐式地包含了一个在屏幕空间中定义的位置('gl_FragCoord'),这取决于你使用'fragPosition'的方式,你根本不需要它。 –

回答

0

你已经得到了多个MVP逆转的顺序。 OpenGL的矩阵乘法是列为主右结合,因此它应该是

mat4 MVP = proj * view * model; 

0.0001的近裁剪平面距离是太低了。实际上,您将所有深度缓冲区分辨率压缩到一个非常小的范围内。尽可能靠近。

我不明白你为什么要为fragPositionfragNormal选择.rgb

+0

我试过这个命令。该着色器之前工作过。 –

+0

@LiessJemai:你的近剪辑平面距离也是有问题的。 – datenwolf

+0

好的,我正在修复这个问题。但是物体消失了,即使我只是乘以一个身份。 –

0

从你的例子看你已经忘记在设置制服之前设置着色器程序。在设置矩阵之前,尝试使用glUseProgram(this->program);(取决于您存储程序的位置)!