3dm*_*els 3 c++ opengl qt glsl qopenglfunctions
我正在学习opengl,我得到了一些带有一些物体的小3D场景.在GLSL顶点着色器中,我在matixes上乘以顶点,如下所示:
vertexPos= viewMatrix * worldMatrix * modelMatrix * gl_Vertex;
gl_Position = vertexPos;
Run Code Online (Sandbox Code Playgroud)
vertexPos是一个vec4变量变量,我将它传递给片段着色器.以下是场景呈现正常的方式: 正常渲染
但后来我做了一个调试渲染.我在片段着色器中写道:
gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0);
Run Code Online (Sandbox Code Playgroud)
vertexPos乘以所有矩阵,包括透视矩阵,我假设我会得到一个从屏幕中心到右边缘的平滑渐变,因为它们被映射为-1到1平方.但看起来它们在屏幕空间中,但不应用透视变形.这是我看到的:(不要看红线和光源,他们使用不同的着色器)
如果我将它除去大约15,它将如下所示:
gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0)/15.0;
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,为什么坐标不均匀,场景仍能正确渲染透视变形?PS如果我尝试将gl_Position放在片段着色器而不是vertexPos中,它就不起作用.
在顶点着色器中计算后,应用所谓的透视分割gl_Position:
gl_Position.xyz /= gl_Position.w;
Run Code Online (Sandbox Code Playgroud)
但除非你手动完成,否则不会发生变化.因此,您需要添加
vertexPos.xyz /= vertexPos.w;
Run Code Online (Sandbox Code Playgroud)
在顶点着色器的末尾.确保在复制值后执行此操作gl_Position,您不希望进行两次除法.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |