C# 错误c0000:语法错误,在标记“?”处出现意外“?”

C# 错误c0000:语法错误,在标记“?”处出现意外“?”,c#,opengl,shader,vbo,opentk,C#,Opengl,Shader,Vbo,Opentk,好吧,我搜索了其他人的问题,但找不到解决我问题的方法。我在C和GLSL330中使用OpenTK。它正在生成错误消息 错误c0000:语法错误,在标记“?”处出现意外“?” 出于某种原因,它不喜欢我正在做的事情。所以,这是我的代码,我希望有人能告诉我 告诉我我做错了什么 public static string vertexShaderSource = @" #version 330 uniform mat4 pvm; in vec4 Position; in vec2 texCoord;

好吧,我搜索了其他人的问题,但找不到解决我问题的方法。我在C和GLSL330中使用OpenTK。它正在生成错误消息 错误c0000:语法错误,在标记“?”处出现意外“?”

出于某种原因,它不喜欢我正在做的事情。所以,这是我的代码,我希望有人能告诉我 告诉我我做错了什么

public static string vertexShaderSource = @"
#version 330

uniform mat4 pvm;

in vec4 Position;
in vec2 texCoord;

out vec2 texCoordV;

void main()
{
    texCoordV = texCoord;
    gl_Position = Position * pvm;
}";

public static string fragmentShaderSource = @"
#version 330

in vec2 texCoordV;

out vec4 colorOut;

void main()
{
    colorOut = vec4(texCoord, 0.0, 0.0);    
}";


    public void Initalize()
    {
        style = GUI_Skin.styles[0];
        vertices = new Vector3[6];
        vertices[0] = new Vector3(0, 0, 0f);
        vertices[1] = new Vector3(100, 0, 0f);
        vertices[2] = new Vector3(0, 100, 0f);
        vertices[3] = new Vector3(100, 0, 0f);
        vertices[4] = new Vector3(0, 100, 0f);
        vertices[5] = new Vector3(100, 100, 0f);

        GL.GenBuffers(1, out vertHandle);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertHandle);
        GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                               new IntPtr(vertices.Length * Vector3.SizeInBytes),
                               vertices, BufferUsageHint.StaticDraw);

        texCoords = new Vector2[6];
        texCoords[0] = new Vector2(0,0);
        texCoords[1] = new Vector2(1, 0);
        texCoords[2] = new Vector2(0, 1);
        texCoords[3] = new Vector2(1, 0);
        texCoords[4] = new Vector2(0, 1);
        texCoords[5] = new Vector2(1, 1);

        GL.GenBuffers(1, out texHandle);
        GL.BindBuffer(BufferTarget.ArrayBuffer, texHandle);
        GL.BufferData<Vector2>(BufferTarget.ArrayBuffer,
                               new IntPtr(texCoords.Length * Vector2.SizeInBytes),
                               texCoords, BufferUsageHint.StaticDraw);
    }

    public void Draw()
    {
        GL.EnableVertexAttribArray(vertHandle);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertHandle);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);

        GL.EnableVertexAttribArray(texHandle);
        GL.BindBuffer(BufferTarget.ArrayBuffer, texHandle);
        GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);

        GL.DrawArrays(PrimitiveType.Triangles, 0, 6);

        GL.DisableVertexAttribArray(vertHandle);
        GL.DisableVertexAttribArray(texHandle);
    }

好了,问题已经解决了。感谢上面的有益评论

让我们从着色器开始。必须删除字符串声明之前的@符号,并插入每行之后的@符号。另外,当我使用着色器绘制时,我正在调用transpose。可以通过改变矩阵的顺序来固定

    public static void Run()
    {
        int uniformLocation = GL.GetUniformLocation(shaderProgramHandle, "pvm");
        Matrix4 mat;
        GL.GetFloat(GetPName.ProjectionMatrix, out mat);
        GL.UniformMatrix4(uniformLocation, false, ref mat);

        GL.UseProgram(shaderProgramHandle);
    }
我从GL.UNIFORMMATRIX4UNIFORMLLOCATION、true、ref mat更改;至GL.UNIFORMMATRIX4UNIFORM位置,错误,参考材料;在着色器本身中,gl_位置的顺序从Position*pvm更改;到pvm*位置

修复后,我得到一个错误,渲染表面变白。错误位于Draw函数中。基本上,我没有正确分配阵列位置

public void Draw()
    {
        GL.EnableVertexAttribArray(0);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertHandle);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);

        GL.EnableVertexAttribArray(1);
        GL.BindBuffer(BufferTarget.ArrayBuffer, texHandle);
        GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);

        GL.DrawArrays(PrimitiveType.Triangles, 0, 6);

        GL.DisableVertexAttribArray(0);
        GL.DisableVertexAttribArray(1);
    }

在编译顶点或片段着色器时,通常会出现一些带有错误的行/位置信息。在我看来,这是字符编码的问题。GLSL需要UTF-8的一小部分,如果在注释之外遇到不需要的字符,则会生成类似这样的错误。如果删除@并在每行末尾使用\n,而不是一个长的逐字字符串文字,这会改变什么吗?Ratchet freak说行号是013,似乎消除了错误,但现在它只是一个白色屏幕。但是,您的回答是正确的:我以前在绑定顶点数据时遇到过类似的问题。莱维格雷厄姆:嗯,我还看到了另一个问题。gl_位置=位置*pvm;在我看来很不寻常。通常在OpenGL中,您会有这样的效果:gl_Position=pvm*Position。除非你的矩阵被存储在可能的行列中,因为我记得至少有一个C的框架来完成这个操作,但是我不记得哪一个,你应该考虑交换操作数。如果你在其他人之前正确回答了你自己的问题,接受你的正确答案。我真的不知道你在说什么,但我猜这是复选标记。看起来你找到了。
public void Draw()
    {
        GL.EnableVertexAttribArray(0);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertHandle);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vector3.SizeInBytes, 0);

        GL.EnableVertexAttribArray(1);
        GL.BindBuffer(BufferTarget.ArrayBuffer, texHandle);
        GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, Vector2.SizeInBytes, 0);

        GL.DrawArrays(PrimitiveType.Triangles, 0, 6);

        GL.DisableVertexAttribArray(0);
        GL.DisableVertexAttribArray(1);
    }