OpenGL неправильно передает вершины вершинному шейдеру - PullRequest
0 голосов
/ 27 июня 2018

Проблема: 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 голосов
/ 27 июня 2018

Для атрибутов вершин с интегральными данными необходимо использовать glVertexAttribIPointer (фокус на I), чтобы определить массив универсальные данные атрибута вершины.

Это означает, что если вы используете тип данных ivec2 для атрибута в вершинном шейдере:

in ivec2 aPos;

тогда вы должны использовать glVertexAttribIPointer когда вы определите массив общих данных атрибутов вершины.

Измените свой код следующим образом, чтобы решить проблему:

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

См. Спецификация профиля совместимости API OpenGL 4.6; 10,2. ТЕКУЩИЕ ЗНАЧЕНИЯ VERTEX ATTRIBUTE; страница m389 :

Когда значения для переменной атрибута вершинного шейдера получены из включенного универсального массива атрибута вершины, массив должен быть указан командой, совместимой с типом данных переменной. Значения, загруженные в переменную атрибута шейдера, привязанную к индексу общего атрибута, не определены, если массив для индекса не был указан с помощью:

  • VertexAttribFormat, для атрибутов базового типа с плавающей точкой;
  • VertexAttribIFormat с типом BYTE, SHORT или INT для целочисленных атрибутов базового типа со знаком; или
  • VertexAttribIFormat с типом UNSIGNED_BYTE, UNSIGNED_SHORT или UNSIGNED_INT для целочисленных атрибутов базового типа без знака.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...