OpenGL ES正交投影矩阵无法正常工作

时间:2015-11-28 20:57:03

标签: swift opengl-es opengl-es-2.0 glkit

所以我的目标很简单。我试图设置我的坐标空间,以便原点位于屏幕的左下角,右上角坐标是(screen.width,screen.height)。

这也是一个完全的2d引擎,所以不需要3D东西。我只需要那些坐标就可以了。

现在我试图在屏幕上绘制几个点。主要是在(0,0),(宽度,高度),(宽度/ 2,高度/ 2)等地方,所以我可以看看事情是否正常。

不幸的是,现在我努力实现这一目标是徒劳的,而不是多点我在设备的死点中有一个(显然它们都是重叠的)。

所以这是我的代码我到底做错了什么?

顶点着色器

uniform vec4 color;
uniform float pointSize;
uniform mat4 orthoMatrix;

attribute vec3 position;

varying vec4 outColor;
varying vec3 center;

void main() {
    center = position;
    outColor = color;
    gl_PointSize = pointSize;
    gl_Position = vec4(position, 1) * orthoMatrix;
}

以下是我制作矩阵的方法。我正在使用GLKit,所以它理论上为我制作了正交矩阵。但是,如果你有一个自定义功能,你认为最好这样做,那就没关系!我也可以使用它。

var width:Int32 = 0
var height:Int32 = 0
var matrix:[GLfloat] = []
func onload()
{
   width = Int32(self.view.bounds.size.width)
   height = Int32(self.view.bounds.size.height)
   glViewport(0, 0, GLsizei(height), GLsizei(width))
   matrix = glkitmatrixtoarray( GLKMatrix4MakeOrtho(0, GLfloat(width), 0,       GLfloat(height), -1, 1))
}
func glkitmatrixtoarray(mat: GLKMatrix4) -> [GLfloat]
    {
        var buildme:[GLfloat] = []
        buildme.append(mat.m.0)
        buildme.append(mat.m.1)
        buildme.append(mat.m.3)
        buildme.append(mat.m.4)
        buildme.append(mat.m.5)
        buildme.append(mat.m.6)
        buildme.append(mat.m.7)
        buildme.append(mat.m.8)
        buildme.append(mat.m.9)
        buildme.append(mat.m.10)
        buildme.append(mat.m.11)
        buildme.append(mat.m.12)
        buildme.append(mat.m.13)
        buildme.append(mat.m.15)
        return buildme

    }

将其传递给着色器

func draw()
{
        //Setting up shader for use
        let loc3 = glGetUniformLocation(program, "orthoMatrix")
        if (loc3 != -1)
        {
            //glUniformMatrix4fv(loc3, 1, GLboolean(GL_TRUE), &matrix[0])
            glUniformMatrix4fv(loc3, 1, GLboolean(GL_TRUE), &matrix[0])
        }
        //Passing points and extra data

}

注意:如果使用顶点着色器中的矩阵移除乘法,则会显示这些点,但是由于OpenGL的默认工作原理,大多数都会在屏幕外显示。

另外:我尝试使用this函数而不是glKit的方法。结果相同。也许我没有把那些东西传递给矩阵制作函数,或者我可能没有正确地将它带到着色器中。

编辑:我已经把project file想要看看一切如何。{/ p>

1 个答案:

答案 0 :(得分:1)

好的,我终于想通了!我做了什么 1.将glkit矩阵转换为数组时,我错误计算了 2.当将矩阵作为制服传递时,您实际上希望整个数组的地址不仅仅是起始元素。 3.将矩阵传递给着色器时,GL_FALSE不是正确的参数。

谢谢你reto matic