【问题标题】:OpenGL ES orthographic projection matrix not workingOpenGL ES正交投影矩阵不起作用
【发布时间】:2015-12-04 07:23:39
【问题描述】:

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

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

现在我正在尝试在屏幕上绘制几个点。主要是在 (0, 0), (width, height), (width / 2, height /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,以防你想看看一切进展如何。

【问题讨论】:

  • GL_TRUE 在 ES 2.0 中作为 glUniformMatrix4fv() 的第三个参数无效。
  • @Retro Koradi GL_FALSE 也不起作用
  • 由于您不能将矩阵转置为上传的一部分,因此您可能必须在着色器代码中从左侧进行乘法运算。我对 GLKit 不熟悉,但大多数工具包构建的矩阵在乘以 matrix * vector 时可以工作。
  • 不幸的是,在顶点着色器中切换它什么也没做
  • 我的意思是所有点都在中心。也许我应该以不同的方式构建矩阵?

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


【解决方案1】:

好的,我终于想通了!我做了什么 1. 将glkit矩阵转为数组时,我算错了。
2. 将矩阵作为统一传递时,您实际上需要整个数组的地址,而不仅仅是开始元素。 3. 将矩阵传递给着色器时,GL_FALSE 不是正确的参数。

谢谢你的回复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多