C# glBufferData在GL#u INVALID#u ENUM中不断失败,即使它不应该';T

C# glBufferData在GL#u INVALID#u ENUM中不断失败,即使它不应该';T,c#,c++,opengl-es,pinvoke,C#,C++,Opengl Es,Pinvoke,有人能看到这个代码有什么问题吗 我对glBufferData的调用一直失败,错误代码为GL\u INVALID\u ENUM。但是,我的值是正确的-我甚至尝试直接硬编码值(以防万一)。根据法律,这应该是有效的 编辑 我创建了一个最小值,或者是ANGLE+XAML+UWP可以得到的最小值。有5个主要文件,其中包含所有工作: -初始化角度并启动渲染循环的主协调器 -初始化角度上下文、显示和曲面的逻辑 -三角形的主要渲染 &–p/invoke方法 如果您下载并运行代码,它应该在 要在基于缓冲区的数

有人能看到这个代码有什么问题吗

我对
glBufferData
的调用一直失败,错误代码为
GL\u INVALID\u ENUM
。但是,我的值是正确的-我甚至尝试直接硬编码值(以防万一)。根据法律,这应该是有效的

编辑

我创建了一个最小值,或者是ANGLE+XAML+UWP可以得到的最小值。有5个主要文件,其中包含所有工作:

  • -初始化角度并启动渲染循环的主协调器
  • -初始化角度上下文、显示和曲面的逻辑
  • -三角形的主要渲染
  • &–p/invoke方法
如果您下载并运行代码,它应该在

要在基于缓冲区的数组和直接数组之间切换,只需更改行:

原创

我的生命看起来与C++代码匹配,运行得很好。我在Windows UWP上使用角度。(如果需要更多上下文,我有完整的代码)

GLfloat[]vertexPositions=new[]{
0.0f,0.5f,0.0f,
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f
};
glGenBuffers(1,out GLuint mVertexPositionBuffer);
Gles.glBindBuffer(0x8892/*Gles.GL_数组_BUFFER*/,mVertexPositionBuffer);
var gcData=GCHandle.Alloc(vertexPositions,GCHandleType.pinted);
试一试{
var size=vertexPositions.Length*Marshal.SizeOf();
var data=gcData.addrofpindedObject();
Gles.glBufferData(0x8892/*Gles.GL\u数组\u缓冲区*/,大小,数据,0x88E4/*Gles.GL\u静态\u绘图*/);
//Gles.glGetError()==Gles.GL\u无效\u枚举
}最后{
gcData.Free();
}
我的p/invoke层
Gles
如下所示:

[DllImport(libGLESv2)]
公共静态外部无效glGenBuffers(GLsizei n,out GLuint buffers);
[DllImport(libGLESv2)]
公共静态外部无效glBindBuffer(GLenum target、GLuint buffer);
[DllImport(libGLESv2)]
公共静态外部无效glBufferData(GLenum目标、GLsizeiptr大小、IntPtr数据、GLenum使用);
<>这是我的C++代码的样子:

GLfloat vertexPositions[]={…};
glGenBuffers(1和mVertexPositionBuffer);
glBindBuffer(GL_数组_BUFFER,mVertexPositionBuffer);
glBufferData(GL_数组_缓冲区、sizeof(顶点显示)、顶点显示、GL_静态_绘制);
我相信我的其余设置/绘图代码是正确的,因为这可以很好地绘制:

GLfloat[]vertexPositions=new[]{
0.0f,0.5f,0.0f,
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f
};
var gcData=GCHandle.Alloc(vertexPositions,GCHandleType.pinted);
试一试{
Gles.glvertexattributepointer((GLuint)mpositionatriblocation,3,Gles.GL_FLOAT,Gles.GL_FALSE,0,gcData.addrofpindedObject());
}最后{
gcData.Free();
}
GlenableVertexAttributeArray((GLuint)复合阳离子);
Gles.GLDrawArray(Gles.GL_三角形,0,3);

如果使用32位体系结构,例如,
GLsizeiptr
必须是32位数据类型

要解决此问题,别名
GLsizeiptr
的类型必须是
System.Int32

using GLsizeiptr = System.Int32;
如果类型为
System.Int64
,则

public static extern void glBufferData(
    GLenum target, GLsizeiptr size, IntPtr data, GLenum usage);
会出现错位


这会导致中的
GL\u INVALID\u ENUM
错误,因为最后一个参数(
usage
)的值不是
GL\u STREAM\u DRAW
GL\u STREAM\u READ

我的GitHub几乎只有3个缓冲区,而不是问题中的1个缓冲区,但我会尝试使用单文件版本。GL不是有史以来最短的代码。@Rabbid76是的,这很奇怪,这就是我开始这个问题的原因。我添加了一个最小的示例,它只是尝试渲染一个基本的三角形:你这个美丽的天才!我只是一个卑微的傻瓜。谢谢就是这样,只有一个傻瓜才会故意使用<代码> Int64 < /COD>来代表C++ >代码>长< /C>。再次感谢!