【发布时间】:2017-08-02 17:58:06
【问题描述】:
假设我的屏幕是 (800 * 600),并且我使用 Triangle_Strip(在 NDC 中)使用以下顶点位置绘制了一个四边形 (2D):
float[] vertices = {-0.2f,0.2f,-0.2f,-0.2f,0.2f,0.2f,0.2f,-0.2f};
我以这种方式设置了我的转换矩阵:
Vector2f position = new Vector2f(0,0);
Vector2f size = new Vector2f(1.0f,1.0f);
Matrix4f tranMatrix = new Matrix4f();
tranMatrix.setIdentity();
Matrix4f.translate(position, tranMatrix, tranMatrix);
Matrix4f.scale(new Vector3f(size.x, size.y, 1f), tranMatrix, tranMatrix);
还有我的顶点着色器:
#version 150 core
in vec2 in_Position;
uniform mat4 transMatrix;
void main(void) {
gl_Position = transMatrix * vec4(in_Position,0,1.0);
}
我的问题是,我应该使用哪个公式来修改四边形的坐标转换(以像素为单位)?
例如:
-设置比例 : (50px, 50px) => Vector2f(width,height)
-设置位置 : (100px, 100px) => Vector2f(x,y)
为了更好地理解,我将创建一个函数来将我的像素数据转换为 NDC,以将它们发送到顶点着色器旁边。有人建议我使用正交投影,但我不知道如何正确创建它,就像你一样可以在我的顶点着色器中看到我没有使用任何投影矩阵。谢谢!
这里有一个和我类似但不是很清楚的话题:
-Transform to NDC, calculate and transform back to worldspace
编辑:
我按照公式创建了正交投影矩阵,但是 似乎什么都没有出现,这就是我的处理方式:
public static Matrix4f glOrtho(float left, float right, float bottom, float top, float near, float far){
final Matrix4f matrix = new Matrix4f();
matrix.setIdentity();
matrix.m00 = 2.0f / (right - left);
matrix.m01 = 0;
matrix.m02 = 0;
matrix.m03 = 0;
matrix.m10 = 0;
matrix.m11 = 2.0f / (top - bottom);
matrix.m12 = 0;
matrix.m13 = 0;
matrix.m20 = 0;
matrix.m21 = 0;
matrix.m22 = -2.0f / (far - near);
matrix.m23 = 0;
matrix.m30 = -(right+left)/(right-left);
matrix.m31 = -(top+bottom)/(top-bottom);
matrix.m32 = -(far+near)/(far-near);
matrix.m33 = 1;
return matrix;
}
然后我将我的矩阵包含在顶点着色器中
#version 140
in vec2 position;
uniform mat4 projMatrix;
void main(void){
gl_Position = projMatrix * vec4(position,0.0,1.0);
}
我错过了什么?
【问题讨论】:
-
只是想澄清一下,您想从屏幕空间转换到 NDC 空间正确吗?
-
是的,屏幕空间(左上角原点),对不起,我在理解 OpenGL 的概念方面有点困难!