glVertexAttribPointer() работает только с первым потоком

Я пытаюсь использовать glVertexAttribPointer(), чтобы передать некоторые данные моему вершинному шейдеру. Дело в том, что он работает только с атрибутом FIRST...

Вот мой код OpenGL:

struct Flag_vertex
{
    GLfloat position_1[ 8 ];
    GLfloat position_2[ 8 ];
};

Flag_vertex flag_vertex;

   ... // fill some data to flag_vertex

GLuint vertexbuffer_id;
glGenBuffers( 1, &vertexbuffer_id );
glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glBufferData( GL_ARRAY_BUFFER, sizeof(flag_vertex), &flag_vertex, GL_STATIC_DRAW );

glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );

glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer_id );
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1) );
glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2) );

и мой шейдер - это что-то вроде:

#version 420 core

layout(location = 0) in vec2 in_position_1;
layout(location = 1) in vec2 in_position_2;

out vec2 texcoord;

void main()
{
    gl_Position = vec4(in_position_X, 0.0, 1.0);
    texcoord = in_position_X * vec2(0.5) + vec2(0.5);
}

Если я использую "in_position_1", моя текстура RENDERS ОТЛИЧНО, но если я использую in_position_2, ничего не происходит...

Совет: перед тем, как связать мои шейдеры, я делаю:

glBindAttribLocation( programID, 0, "in_position_1");
glBindAttribLocation( programID, 1, "in_position_2");

Почему это работает только с первым потоком? Мне нужно больше данных, идущих в мою вершину... Мне нужно отправить цвет и т. Д.... любой намек?

1 ответ

glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1) );
glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2) );

Эти строки не имеют смысла. По крайней мере, не с тем, как Flag_vertex определено. Если Flag_vertex на самом деле предполагается, что это вершина (а не четверка), тогда нет смысла иметь 8 поплавков. Если каждый Flag_vertex определяет полный квад, тогда вы назвали его неправильно; это совсем не вершина, это Flag_quad,

Так что трудно понять, чего ты здесь пытаешься достичь.

Также:

Если я использую "in_position_1", моя текстура RENDERS ОТЛИЧНО, но если я использую in_position_2, ничего не происходит...

Конечно, это так. Ваши данные о положении находятся в атрибуте 0. Следовательно, ваши данные о положении не находятся в атрибуте 1. Если вы притворяетесь, что у атрибута 1 есть ваши данные о положении, когда их явно нет, вы не получите разумных результатов.

Ваша проблема в том, что вы всегда используете атрибут 0, когда вы должны использовать оба из них. Вы не должны выбирать один или другой. использование in_position_1 для должности и in_position_2 для координаты текстуры. И попробуйте назвать их разумно, исходя из того, что они делают (например, position а также texture_coord или что-то). Не используйте цифры для них.

Совет: перед тем, как связать мои шейдеры, я делаю:

Это то же самое, что и layout(location=#) установка в шейдер. Если вы хотите это в шейдере, то поместите его в шейдер. Если вы хотите это в своем коде OpenGL, то поместите это в свой код OpenGL. Не кладите это в обоих местах.

Другие вопросы по тегам