2

尝试将我的游戏引擎从 PC 移植到 Android 时,我遇到了几个 OpenGL 函数的障碍,这些函数的工作方式不同,文档中没有任何内容有助于理解原因。

问题出现在着色器程序中,在 PC 上,我通过 OpenGL 查询属性和制服以构造一个键控集合,以便轻松自动传递常用参数。

在 PC 上,我使用以下函数来构造键控集合:

void LoadUniforms()
    {
        int activeUniforms;
        GL.GetProgram(m_ID, ProgramParameter.ActiveUniforms, out activeUniforms);
        for (int i = 0; i < activeUniforms; i++)
        {
            int size;
            ActiveUniformType type;
            string name = GL.GetActiveUniform(m_ID, i, out size, out type);
            ShaderUniform uniform = null;

            uniform = new ShaderUniform(this, name, size, type);
            if (uniform != null)
                m_uniformParameters.Add(uniform);
        }
    }

我尝试将其转换为 OpenTK 的 GLES 2.0,如下所示,maxLength 和 activeUniforms 始终为 0。

void LoadUniforms()
    {
        int length = 0;
        int maxLength = 0;
        GL.GetProgram(m_ID, All.ActiveUniformMaxLength, ref maxLength);

        int activeUniforms = 0;
        GL.GetProgram(m_ID, All.ActiveUniforms, ref activeUniforms);
        for (int i = 0; i < activeUniforms; i++)
        {
            All type = All.None;
            int size = 0;
            string name = string.Empty;
            GL.GetActiveUniform(m_ID, i, maxLength, ref length, ref size, ref type, name);

            ShaderUniform uniform = new ShaderUniform(this, name, size, (ShaderUniformType)type);
            if (uniform != null)
                m_uniformParameters.Add(uniform);
        }
    }

于是我继续尝试 Android.Opengl 怀疑可能是 OpenTK 的 GLES 2.0 接口不完整,但仍然是同样的问题。

所以现在我只剩下这个问题了。我是否错过了编译和链接着色器程序以及能够查询活动制服之间的一些步骤?尝试查询活动属性时也会出现完全相同的问题(对于最大长度和计数,始终为 0)。

我用来测试它的顶点着色器如下。

uniform mat4 World;
uniform mat4 View;
uniform mat4 Projection;

attribute vec3 Posiiton;
attribute vec2 TexCoord;

varying vec2 TexCoord0;

void main()
{
    mat4 worldViewProject = Projection * View * World;
    vec4 pos = vec4(Position, 1);
    pos *= World;
    pos *= View;
    pos *= Project;
    gl_Position = pos;
    TexCoord0 = TexCoord;
}

在被我习惯的更自动的方法所破坏后,我真的很讨厌必须检查游戏使用的每一个着色器并手动绘制参数。所以我真的希望这只是我错过的东西。

4

1 回答 1

0

嗯,我想通了,有点。我为处理#include 语句而设置的预处理器在文件中插入了一个过多的引号,从而生成了一个 EOL/EOF 异常,由于某种原因,直到我逐行执行执行时才抛出该异常。一旦我修复了由于我忽略的拼写错误而开始在着色器上出现编译错误,之后它就像 PC 版本一样工作。

于 2012-09-24T22:03:44.897 回答