Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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 OpenGL使用像素坐标系_C_Opengl_Glsl - Fatal编程技术网

C OpenGL使用像素坐标系

C OpenGL使用像素坐标系,c,opengl,glsl,C,Opengl,Glsl,好的,我用VBO画了一个正方形(坐标是0,01,01,10,1),我画的是这样的: glTranslatef(200, 100, 0); glScalef(200, 200, 0); square_draw(); // Draws the square 这是没有着色器的。它很好用。但是,当我想使用着色器(对于图像)绘制它时,它可以工作,但它在屏幕的右上角绘制,完全忽略平移和缩放 现在我知道了为什么会发生这种情况:OpenGL有一个坐标系,该坐标系将0,0设置在中间,而-1,-1和1,1则在屏幕

好的,我用VBO画了一个正方形(坐标是
0,01,01,10,1
),我画的是这样的:

glTranslatef(200, 100, 0);
glScalef(200, 200, 0);
square_draw(); // Draws the square
这是没有着色器的。它很好用。但是,当我想使用着色器(对于图像)绘制它时,它可以工作,但它在屏幕的右上角绘制,完全忽略平移和缩放

现在我知道了为什么会发生这种情况:OpenGL有一个坐标系,该坐标系将
0,0
设置在中间,而
-1,-1
1,1
则在屏幕范围内


所以我想知道的是:有可能使用像素坐标系吗?如图所示,
0,0
是左上角,
1,1
是左上角的一个像素,等等。

这正是投影矩阵应该做的。在您的情况下,需要反转Y轴(顶部变为底部)以生成所需的投影。但是,请理解,这样做将反转多边形缠绕之类的事情。因此,如果剔除多边形边或根据着色的边做不同的操作,也需要更改正面的缠绕方向。@AndonM.Coleman我如何在Opengl 3+着色器中实现投影矩阵?大致如下:
gl_Position=ProjMat*vertex。真正的问题是如何在C中实现它,这取决于您。大多数数学库都有创建4x4列主矩阵的函数,如正交/透视投影。最常用的图书馆(GLM)是C++,不幸的是。我不知道如何在C语言中实现这一点。如何在C语言中计算
ProjMat
?我会说,看看手册页面,它会向您展示您自己实现它所需的所有数学知识。只需知道OpenGL使用列主矩阵,因此在4x4矩阵中,m[0]是第一列的第一行,m[1]是第一列的第二行,m[4]是第二列的第一行,等等(
GLfloat m[16]
)。