大家好日子。我使用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库时,此行为仍在继续。突然开始工作的无法解释的过程仍然无法解释。