我在openGL中的标准化正交坐标有什么问题
What is wrong with my normalized orthographic coordinates in openGL?
我正试图在openGL中创建一个三角形,当我调整窗口大小时,它不会拉伸。我将此正交矩阵传递给顶点着色器。
void resize(int w, int h) {
float orthMat[4][4];
orthMat[0][0] = 2.0/w;
orthMat[1][1] = -2.0/h;
orthMat[3][3] = 1.0;
orthMat[3][3] = 1.0;
orthMat[3][0] = -1.0;
orthMat[3][1] = -1.0;
orthMat[0][1] = 0.0;
orthMat[0][2] = 0.0;
orthMat[0][3] = 0.0;
orthMat[1][0] = 0.0;
orthMat[1][3] = 0.0;
orthMat[1][2] = 0.0;
orthMat[2][0] = 0.0;
orthMat[2][1] = 0.0;
orthMat[2][2] = 0.0;
orthMat[2][3] = 0.0;
orthMat[3][2] = 0.0;
glUniformMatrix4fv(uniformLocationIndex, 1, GL_TRUE, &orthMat[0][0]);
glViewport(0,0,w,h);
}
uniformLocationIndex指向我的顶点着色器中的"projMat"。
#version 330
in vec2 position;
in mat4 projMat;
void main() {
//vec4 contains normalized x and y coordinates
gl_Position = projMat * vec4(((-1.0) + position.x*(2.0/(2.0/projMat[0][0]))),
(1.0 - position.y*(2.0/(-2.0/projMat[1][1]))),
0.0, 1.0);
}
无论我把点放在哪里,它们都会指向中心,并且在调整窗口大小时无法正确缩放。它应该保持纵横比并缩小比例。
我做了一些数学运算,我认为问题在于着色器计算。
我用创建了一个投影矩阵
左剪裁平面=-1右侧剪裁平面=1顶部剪裁平面=1底部剪裁平面=-1近剪裁平面=0.001远裁剪平面=2
将我创建的这个矩阵与您的矩阵进行比较,第2行和第3行存在显著差异,但由于看起来您没有使用这些矩阵,因此我忽略了这一点。
然后我做了gl_Position计算中涉及的数学运算,除非我弄错了,否则我得到了:
点(1,1)转换为(0,0)
点(1,-1)转换为(0,2)(在视野外)
点(-1,1)转换为(-2,0)(视野外)
点(-1,-1)转换为(-2,2)(视野外)
我认为你的矩阵中没有第2行和第3行(0和1看起来不错),但同样,由于你没有使用它们,如果你在着色器中说这样的话,你应该能够通过:
vec4 Position = projMat * vec4(position, 0.0, 1.0);
gl_Position = vec4(Position.x, Position.y, 0.0, 1.0);
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 比较两个节点坐标的最佳方法是什么?
- 屏幕坐标和设备坐标有什么区别?
- 我在openGL中的标准化正交坐标有什么问题
- 为openGL提供3D坐标的顺序是什么?
- 这段代码中的顶点和纹理坐标代表什么?
- 极坐标-笛卡尔坐标转换不正确.-0是什么意思