OpenGL错误地传递了顶点着色器的顶点

时间:2018-06-27 03:45:16

标签: opengl glsl

问题:由于某种原因,Opengl正在将我传递给顶点数组对象的整数数组转换为浮点数组。

当我尝试在顶点着色器中将顶点用作ivec2时,我得到一些奇怪的数字作为输出,但是,如果我使用vec2代替,则会得到预期的输出。

代码:

VertexShader:

#version 430 core
//                         \/ This is what I'm reffering to when talking about ivec2 and vec2
layout (location = 0) in ivec2 aPos;

uniform uvec2 window;

void main()
{
    float xPos = float(aPos.x)/float(window.x);
    float yPos = float(aPos.y)/float(window.y);

    gl_Position = vec4(xPos, yPos, 1.0f, 1.0f);
}

传递顶点数组:

GLint vertices[] =
{
    -50,  50,
     50,  50,
     50, -50,
    -50, -50
};

GLuint VBO, VAO;

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);  //  \/ I'm passing it as an int
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 2 * sizeof(GLint), (void*)0);
glEnableVertexAttribArray(0);

glUseProgram(sprite2DProgram);
glUniform2ui(glGetUniformLocation(sprite2DProgram, "window"), 640, 480);

输出:

第一张图片是我使用ivec2时发生的情况(输出错误)。 第二张图片是使用vec2(预期的输出)时会发生的情况。 What happens when I use ivec2 What happens when I use vec2 (The correct output)

如果您需要了解其他信息,请在评论中提出。

1 个答案:

答案 0 :(得分:4)

对于具有整数数据的顶点属性,必须使用glVertexAttribIPointer(着重于 I )来定义通用顶点属性数据的数组。

这意味着,如果对顶点着色器中的属性使用ivec2数据类型:

in ivec2 aPos;

然后,您必须使用glVertexAttribIPointer来定义通用顶点属性数据的数组。

像这样更改代码,以解决该问题:

// glVertexAttribIPointer instead of glVertexAttribPointer
glVertexAttribIPointer(0, 2, GL_INT, GL_FALSE, 2 * sizeof(GLint), (void*)0);

请参见OpenGL 4.6 API Compatibility Profile Specification; 10.2. CURRENT VERTEX ATTRIBUTE VALUES; page m389

  

当顶点着色器属性变量的值来自启用的通用顶点属性数组时,   数组必须由与变量的数据类型兼容的命令指定。   如果未通过以下方式指定索引数组,则加载到绑定到通用属性索引的着色器属性变量中的值是不确定的:

     
      
  • VertexAttribFormat,用于浮点基类型属性;
  •   
  • 具有BYTE,SHORT或INT类型的VertexAttribIFormat,用于带符号整数基本类型属性;或
  •   
  • 类型为UNSIGNED_BYTE,UNSIGNED_SHORT或UNSIGNED_INT的VertexAttribIFormat(用于无符号整数基本类型属性)。
  •