在GLES 2.0中查询活动的制服和顶点属性

时间:2012-09-23 23:31:03

标签: android xamarin.android opengl-es-2.0 opentk

试图将我的游戏引擎从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;
}

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

1 个答案:

答案 0 :(得分:0)

嗯,我想通了,有点儿。我设置处理#include语句的预处理器是在生成EOL / EOF异常的文件中插入一个太多的引号,这个异常由于某种原因在我执行逐行执行之前没有被抛出。一旦我修复了,由于我忽略了错别字,我开始在着色器上出现编译错误,之后它就像PC版一样工作。