Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Gl.VertexAttribPointer()在指定整数偏移量时不起作用,但在输入null时起作用_C#_Opengl - Fatal编程技术网

C# Gl.VertexAttribPointer()在指定整数偏移量时不起作用,但在输入null时起作用

C# Gl.VertexAttribPointer()在指定整数偏移量时不起作用,但在输入null时起作用,c#,opengl,C#,Opengl,我正在尝试使用OpenGL.NET在C#和OpenGL中制作一个游戏引擎。我已经抽象了基本的OpenGL对象,如VAO、VBO等。我有一个BufferLayout类,它指定顶点缓冲区中存在的数据。VertexArray类中添加缓冲区的方法如下: public void AddBuffer(uint索引,ref VertexBuffer缓冲区) { Bind(); buffer.Bind(); uint i=指数; foreach(buffer.Layout.Elements中的BufferEle

我正在尝试使用OpenGL.NET在C#和OpenGL中制作一个游戏引擎。我已经抽象了基本的OpenGL对象,如VAO、VBO等。我有一个BufferLayout类,它指定顶点缓冲区中存在的数据。VertexArray类中添加缓冲区的方法如下:

public void AddBuffer(uint索引,ref VertexBuffer缓冲区)
{
Bind();
buffer.Bind();
uint i=指数;
foreach(buffer.Layout.Elements中的BufferElement元素)
{
Gl.VertexAttribute指针(
i++,
元素。GetComponentCount(),
Globals.shaderDataTypeTooPengelBaseType(element.Type),
元素。标准化,
buffer.Layout.Stride,
元素。偏移量
);
}
m_Buffers.Add(buffer);
}
此方法有两个重载:一个以
IntPtr
作为偏移量,另一个以
对象
作为偏移量。 这是接收
对象的重载。但是由于某种原因,
元素.Offset
没有按预期工作。因为我只在这个测试中使用positions属性,所以当我用
null
替换
element.Offset
时,它会起作用

这里是BufferLayout.cs

公共枚举着色器数据类型
{
没有一个
浮动,浮动2,浮动3,浮动4,
Mat3,Mat4,
Int,Int2,Int3,Int4,
}
公共类缓冲元素
{
内部字符串名称;
内部ShaderDataType类型;
内部整数大小;
内部整数偏移;
内部布尔归一化;
公共缓冲区元素(ShaderDataType类型,字符串名称,bool normalized=false)
{
名称=名称;
类型=类型;
Size=Globals.ShaderDataTypeSize(类型);
偏移量=0;
归一化=归一化;
}
内部空隙设置偏移量(内部偏移量)=>偏移量=偏移量;
public int GetComponentCount()
{
开关(类型)
{
case ShaderDataType.Float:返回1;
case ShaderDataType.Float2:返回2;
case ShaderDataType.Float3:返回3;
case ShaderDataType.Float4:返回4;
case ShaderDataType.Mat3:返回3*3;
case ShaderDataType.Mat4:返回4*4;
case ShaderDataType.Int:返回1;
case ShaderDataType.Int2:返回2;
case ShaderDataType.Int3:返回3;
case ShaderDataType.Int4:返回4;
}
返回0;
}
}
内部密封类缓冲区布局
{
公共列表元素{get;private set;}
公共集{get;私有集;}
公共缓冲区布局(缓冲区元素[]e)
{
元素=新列表();
元素。添加范围(e);
计算ffsetsandstride();
}
私有void CalculateOffsetsAndStride()
{
整数偏移=0;
步幅=0;
for(int i=0;i
获取对象的重载用于兼容配置文件,对象必须是包含顶点数组数据的对象

如果要设置偏移,则必须创建
IntPtr
。e、 g:

var offset=新的IntPtr(element.offset);
Gl.VertexAttribute指针(
i++,
元素。GetComponentCount(),
Globals.shaderDataTypeTooPengelBaseType(element.Type),
元素。标准化,
buffer.Layout.Stride,
抵消
);

请注意,偏移量和步幅参数必须以字节为单位指定。

非常感谢