Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# 顶点属性缓冲区绑定到错误的属性_C#_Opengl_Glsl_Opentk - Fatal编程技术网

C# 顶点属性缓冲区绑定到错误的属性

C# 顶点属性缓冲区绑定到错误的属性,c#,opengl,glsl,opentk,C#,Opengl,Glsl,Opentk,当我将缓冲区绑定到着色器的属性时,它们似乎被翻转了 我有一个顶点着色器: 和一个片段着色器 没什么太复杂的。有两个输入:一个用于顶点位置,另一个用于颜色。作为一个新手,我还不想处理纹理或光线 现在,在我的客户端代码中,我将数据放入两个向量数组,positionVboData和colorVboData,然后创建VBOs 但是,事实上,我必须在上一个代码示例中交换positionVboHandle和colorVboHandle,然后它才能完美地工作。但在我看来,这似乎是倒退。我错过了什么 更新 有些

当我将缓冲区绑定到着色器的属性时,它们似乎被翻转了

我有一个顶点着色器:

和一个片段着色器

没什么太复杂的。有两个输入:一个用于顶点位置,另一个用于颜色。作为一个新手,我还不想处理纹理或光线

现在,在我的客户端代码中,我将数据放入两个向量数组,positionVboData和colorVboData,然后创建VBOs

但是,事实上,我必须在上一个代码示例中交换positionVboHandle和colorVboHandle,然后它才能完美地工作。但在我看来,这似乎是倒退。我错过了什么

更新

有些奇怪的事情正在发生。如果将顶点着色器更改为:

并且除了建议的修复程序外,不进行其他更改,以移动程序链接。在所有设置完成后,它会将正确的属性(顶点位置)加载到in_位置,而不是in_颜色。

必须在GL.LinkProgram之前执行。您是否在此代码片段后调用GL.LinkProgram

编辑: 回答您的更新-因为您不使用in_color,所以OpenGL会忽略此输入。顶点着色器仅在_位置作为输入。它很可能将其绑定到位置0。这就是你的代码工作的原因。您应该在链接程序之前绑定位置,如上面链接中所述。

必须在GL.LinkProgram之前执行。您是否在此代码片段后调用GL.LinkProgram

编辑:
回答您的更新-因为您不使用in_color,所以OpenGL会忽略此输入。顶点着色器仅在_位置作为输入。它很可能将其绑定到位置0。这就是你的代码工作的原因。您应该在链接程序之前绑定位置,正如上面链接中所描述的那样。

所以,在玛蒂莫季科的帮助下,我能够解决这个问题。我在正确调用LinkProgram之前调用了BindAttriblation。但是,在绑定任何属性位置之前,我没有调用GL.CreateProgram。

因此,在玛蒂莫季科的帮助下,我能够解决这个问题。我在正确调用LinkProgram之前调用了BindAttriblation。但是,在绑定任何属性位置之前,我没有调用GL.CreateProgram。

最初,我不认为我正在使用的一个示例也出现了错误,但我修复了它,发现了相同的问题。我搜索了BindAttriblLocation,并在每个示例前面放置了调试输出,搜索LinkProgram并在其前面放置调试输出。我得到:绑定属性。。。绑定属性。。。链接…在你的帮助下,我找到了正确的方向。谢谢起初,我不认为我正在使用的一个示例也有错误,但我修复了它,我看到了相同的问题。我搜索BindAttriblLocation并将调试输出放在每个示例的前面,搜索LinkProgram并将调试输出放在前面。我得到:绑定属性。。。绑定属性。。。链接…在你的帮助下,我找到了正确的方向。谢谢您应该使用glGetError函数验证所有OpenGL调用。它将立即指示错误的函数调用。您应该使用glGetError函数验证所有OpenGL调用。它将立即指示错误的函数调用。
precision highp float;

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 in_position;
in vec3 in_color;

out vec3 ex_Color;

void main(void)
{ 
  gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
  ex_Color = in_color;
}
precision highp float;

in vec3 ex_Color;

out vec4 out_frag_color;

void main(void)
{
  out_frag_color = vec4(ex_Color, 1.0);
}
GL.GenBuffers(1, out positionVboHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle);
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                       new IntPtr(positionVboData.Length * Vector3.SizeInBytes),
                       positionVboData, BufferUsageHint.StaticDraw);

GL.GenBuffers(1, out colorVboHandle);
GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle);
GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                new IntPtr(colorVboData.Length * Vector3.SizeInBytes),
                colorVboData, BufferUsageHint.StaticDraw);
    GL.EnableVertexAttribArray(0);
    GL.BindBuffer(BufferTarget.ArrayBuffer, positionVboHandle);
    GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0);
    GL.BindAttribLocation(shaderProgramHandle, 0, "in_position");

    GL.EnableVertexAttribArray(1);
    GL.BindBuffer(BufferTarget.ArrayBuffer, colorVboHandle);
    GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, true, Vector3.SizeInBytes, 0);
    GL.BindAttribLocation(shaderProgramHandle, 1, "in_color");
precision highp float;

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;

in vec3 in_position;
in vec3 in_color;

out vec3 ex_Color;

void main(void)
{
  gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
  //ex_Color = in_color;
  ex_Color = vec3(1.0, 1.0, 1.0);
}"