2015-01-04 153 views
0

sharpgl不能调用扩展功能glShaderSource

System.Exception: Cannot invoke extension function glShaderSource ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: Cannot marshal: Encountered unmappable character. 
    at System.StubHelpers.MngdNativeArrayMarshaler.ConvertContentsToNative(IntPtr pMarshalState, Object& pManagedHome, IntPtr pNativeHome) 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
    at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) 
    at System.Delegate.DynamicInvokeImpl(Object[] args) 
    at System.Delegate.DynamicInvoke(Object[] args) 
    at SharpGL.OpenGL.InvokeExtensionFunction[T](Object[] args) in c:\Repositories\GitHub\sharpgl\source\SharpGL\Core\SharpGL\OpenGLExtensions.cs:line 66 
    --- End of inner exception stack trace --- 
    at SharpGL.OpenGL.InvokeExtensionFunction[T](Object[] args) in c:\Repositories\GitHub\sharpgl\source\SharpGL\Core\SharpGL\OpenGLExtensions.cs:line 70 
    at SharpGL.OpenGL.ShaderSource(UInt32 shader, String source) in c:\Repositories\GitHub\sharpgl\source\SharpGL\Core\SharpGL\OpenGLExtensions.cs:line 1296 
    at SharpGL.Shaders.Shader.Create(OpenGL gl, UInt32 shaderType, String source) in c:\Repositories\GitHub\sharpgl\source\SharpGL\Core\SharpGL\Shaders\Shader.cs:line 20 
    at SharpGL.Shaders.ShaderProgram.Create(OpenGL gl, String vertexShaderSource, String fragmentShaderSource, Dictionary`2 attributeLocations) in c:\Repositories\GitHub\sharpgl\source\SharpGL\Core\SharpGL\Shaders\ShaderProgram.cs:line 26 

我目前使用的代码是

try 
{ 
    // Create the shader program. 
    var vertexShaderSource = @"#version 150 core 
in vec3 in_Position; 
in vec3 in_Color; 
out vec3 pass_Color; 
uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 
uniform mat4 modelMatrix; 
void main(){gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);pass_Color = in_Color;}"; 

    var fragmentShaderSource = @"#version 150 core 
in vec3 pass_Color; 
out vec4 out_Color; 
void main(void){ out_Color = vec4(pass_Color, 1.0); }"; 

    shaderProgram = new ShaderProgram(); 
    shaderProgram.Create(gl, vertexShaderSource, fragmentShaderSource, null); // <- exception 
    shaderProgram.BindAttributeLocation(gl, attributeIndexPosition, "in_Position"); 
    shaderProgram.BindAttributeLocation(gl, attributeIndexColour, "in_Color"); 
    shaderProgram.AssertValid(gl); 
} 
catch (Exception e) 
{ 
    System.Diagnostics.Debug.Write(e.ToString()); 
} 

唯一的例外是在shaderProgram.Create一行。当移除或缩小着色器源字符串时,错误不会发生,但是随后着色器将无法编译,并且出现Failed to compile shader with ID 2.错误。我还发现,在源代码的地方,除了自带from但对如何解决这一问题或有什么实际的原因是不知道。

+0

不知道这是否可以解释你的症状,但着色器肯定不会成功编译。你声明'in_Position',然后使用'in_Potision'。 – 2015-01-04 20:54:52

+0

不错,但它没有解决问题,因为它没有得到着色器的编译 – ColmanJ 2015-01-06 16:12:08

回答

0

我已经解决了这一问题。在着色器角色旁边显示它们是in_Color后的一个奇怪字符。使用notepad ++和ANSI编码查看源代码显示了一些不应该是它们的字符。

供将来参考查看在不同的编码源,并检查是否有谁不应该有任何字符。