【问题标题】:How do you perform OpenGL ES 2.0 shader matrix multiplication?您如何执行 OpenGL ES 2.0 着色器矩阵乘法?
【发布时间】:2010-08-04 13:01:10
【问题描述】:

我正在尝试使用着色器程序转换顶点,但我无法理解结果。 我准备了一个投影、一个视图(trans)和模型(trans)矩阵:

首先我有一个顶点着色器函数:viewproj * 位置。在一个 Objective-C 程序中,我从身份乘以平移和投影矩阵开始,然后统一到 viewproj。我可以透视地看到几何响应全局平移。

我想分别统一矩阵并在着色器中操作。我统一了一个 proj、view(trans)、model(trans),并在着色器中尝试:projviewmodelposition。但是 sems 没有很好地转换(输出表示?)然后我尝试简单地模拟我的第一个转换。我统一 proj 并查看,在着色器中我尝试使用 (viewproj)position 以执行相同的操作,但不是在 C 中完成的 viewproj。

我使用第 0-4 列中描述的矩阵是第一列。并使用http://www.songho.ca/opengl/gl_transform.html#modelview中定义的结构@

现在我不知道我错过了什么,希望有一个简单的答案。如果哪位有线索,谢谢。

pd:我可以调试这个着色器吗? (XCode + iphoneos 模拟器)

【问题讨论】:

    标签: iphone opengl-es transform shader matrix


    【解决方案1】:

    如果有人知道,谢谢。

    OpenGL 着色器中的矩阵乘法如下:

        gl_Position = projectionMat*modelViewMat*vec4(inPos, 1.0);
    

    inPos 是 vec3 顶点位置。

    如果你想要更多的矩阵(DirectX 风格),那么你将不得不使用

        gl_Position = projectionMat*viewMat*worldMat*vec4(inPos, 1.0);
    

    理想情况下,矩阵应该从 OpenGL 中提取,投影不应该是恒等变换。如果需要 2d 图形,请使用 gluOrtho2D。

    您还可能在将矩阵加载到统一中时意外转置或忘记转置矩阵。

    无论如何,如果您在使用着色器时遇到问题,请先编写无需着色器即可渲染事物的应用程序,然后编写着色器并从 OpenGL 加载转换矩阵,然后将其(如果需要)转换为自定义矩阵计算例程。

    根据 OpenGL 版本,您可能有 ftransform() GLSL 函数可用,这将进一步简化事情。

    【讨论】:

      【解决方案2】:

      我从身份乘以平移和投影矩阵开始,然后统一到 viewproj

      就是identity->translation->viewproj->projection,就像你说的:

      项目视图模型*位置

      你很难阅读。你可以发布一些代码吗?

      【讨论】:

        猜你喜欢
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多