Android OpenTK OpenGL ES20编译器不可用

时间:2015-02-05 23:26:21

标签: c# android opengl-es shader opentk

大家好日子。我使用OpenTK和C#在Android上使用OpenGL ES 2.0着色器时遇到了一些困难。着色器无法编译,没有任何日志输出。即使我故意在着色器中引入错误,仍然没有输出。我检查了平台是否支持在线编译......

public static bool HasCompiler
{
    get
    {
        bool result = false;
        GL.GetBoolean(GetPName.ShaderCompiler, out result);
        return result;
    }
}

......我得到了令人惊讶的结果,但事实并非如此。出于两个原因,这是令人惊讶的。首先,我所有的研究表明它应该。其次,更重要的是,它提前几分钟。几分钟前,它很高兴地编译了着色器,甚至提供了有关着色器代码中错误的有用反馈。

我没有直接使用着色器代码,或者在该间隔期间对着色器起作用的任何代码。我确实在着色器程序类上工作,但它没有触及着色器本身。我确实尝试更改使用这些类的应用程序使用的OpenTK版本,我认为这可能是罪魁祸首。但是,似乎无论我添加到我的(Visual Studio 2013)项目的OpenTK库的哪个版本,它都会坚持使用MonoAndroid / v4.03的版本。

无论如何,我很遗憾,并希望得到任何可以提供的帮助。

着色器类,不包括属性和处置。

public class Shader : IDisposable
{
    public static bool HasCompiler
    {
        get
        {
            bool result = false;
            GL.GetBoolean(GetPName.ShaderCompiler, out result);
            return result;
        }
    }

    private int shaderHandle = -1;
    private ShaderStage stage;
    private string shaderSource;

    private bool isDisposed;

    public Shader(ShaderStage stage, string source)
    {
        if (string.IsNullOrEmpty(source))
            throw new ArgumentNullException("source");

        // Currently stops here.
        if (!HasCompiler)
            throw new PlatformNotSupportedException("Current device does not support shader compilation.");

        this.stage = stage;
        this.shaderSource = source;

        this.shaderHandle = GL.CreateShader(stage == ShaderStage.Vertex ? ShaderType.VertexShader : ShaderType.FragmentShader);

        if (shaderHandle == 0)
            throw new HeronException("Could not create shader.");

        GL.ShaderSource(shaderHandle, source);
        GL.CompileShader(shaderHandle);
        GLHelper.CheckError();

        // Check status.
        int compiled = 0;
        GL.GetShader(shaderHandle, ShaderParameter.CompileStatus, out compiled);

        if (compiled == 0)
        {
            // If I don't check for support, it stops here with an empty log and no GL ErrorCode.
            string log = "Could not create shader (GL Error: " + GL.GetErrorCode().ToString() + "):\n" + GL.GetShaderInfoLog(shaderHandle);
            Ozymandias.OS.Diagnostics.Debug.Log(1, "OpenGL", log);
            GL.DeleteShader(shaderHandle);
            throw new HeronException(log);
        }
    }
}

消费代码。

string vertexSource = "attribute vec4 vPosition;\nvoid main()\n{\ngl_Position = vPosition;\n}\n";
string pixelSource = "precision mediump float;\nvoid main()\n{\ngl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n}\n";
Shader vertex = new Shader(Ozymandias.Heron.Graphics.ShaderStage.Vertex, vertexSource);
Shader pixel = new Shader(Ozymandias.Heron.Graphics.ShaderStage.Pixel, pixelSource);

如上所述,我曾尝试故意在着色器代码中引入错误。以前这会引发一个有用的编译日志,但不再是。再一次,任何洞察力都将受到赞赏。

附录1

我已经把事情剥夺了基础。我已经更新了所有相关的SDK,并开始使用干净的“OpenGL App”模板。我没有改变任何项目设置或引用。我在OnLoad方法中只添加了四行代码,位于'base.OnLoad(e);'之间。和'Run();'。

bool hasCompiler = false;
GL.GetBoolean(All.ShaderCompiler, ref hasCompiler);

if (!hasCompiler)
    throw new Exception("No compiler.");

模拟器和物理设备都会抛出异常。然而,在写这篇文章时,我改变了一行并得出了一个奇怪的结果。

bool hasCompiler = true;

当默认值更改为true时,代码将无异常运行。这表明GL.GetBoolean方法实际上并没有修改结果。

附录2

代码未更改,也没有任何项目设置,引用或环境特征。但是,无论值是true还是false,代码现在都可以成功运行。言语让我失望。

附录3

无论hasCompiler的值是初始化为true还是false,代码都会继续成功运行。它成功编译了有效的着色器,并且无法编译存在错误的着色器。我犹豫地决定进行测试并删除OpenTK 0.9.9.3库并添加了OpenTK 1.0.0.0库。

执行此操作后,代码返回到先前的状态,在该状态下,当值初始化为true时将运行,并在初始化为false时抛出异常。当我返回使用OpenTk 0.9.9.3库时,此行为仍在继续。突然开始工作的无法解释的过程仍然无法解释。

0 个答案:

没有答案