Я переместил этот ответ из повторяющегося и удаленного вопроса Использование атрибута вершины с индексом 0 вместо атрибута фиксированной функции GL_VERTEX_ARRAY здесь.
Если расширение OpenGL ARB_vertex_program; Modify Section 2.7, Vertex Specification
действительно, значит существует отображение между атрибутами фиксированной функции и индексами атрибутов:
Установка нулевого общего атрибута вершины указывает на вершину; четыре координаты вершины берутся из значений атрибута ноль. Команда Vertex2, Vertex3 или Vertex4 полностью эквивалентна соответствующей команде VertexAttrib с нулевым индексом. Установка любого другого универсального атрибута вершины обновляет текущие значения атрибута. Нет текущих значений для нулевого атрибута вершины.
Реализации могут, но не обязательно, использовать одно и то же хранилище для текущих значений общих и некоторых стандартных атрибутов вершин. Когда указывается любой общий атрибут вершины, отличный от нуля, текущие значения для соответствующего стандартного атрибута в таблице X.1 становятся неопределенными. Кроме того, когда указан обычный атрибут вершины, текущие значения для соответствующего универсального атрибута вершины в таблице X.1 становятся неопределенными. Например, установка текущей нормали оставит общий атрибут вершины 2 неопределенным, и наоборот.
| Generic Attribute | Conventional Attribute | Conventional Attribute Command |
|-------------------|--------------------------|--------------------------------|
| 0 | vertex position | Vertex |
| 1 | vertex weights 0-3 | WeightARB, VertexWeightEXT |
| 2 | normal | Normal |
| 3 | primary color | Color |
| 4 | secondary color | SecondaryColorEXT |
| 5 | fog coordinate | FogCoordEXT |
| 6 | - | - |
| 7 | - | - |
| 8 | texture coordinate set 0 | MultiTexCoord(TEXTURE0, ... |
| ... | | |
Это означает, что существует «отображение» между атрибутом вершины 0 и фиксированным атрибутом функции GL_VERTEX_ARRAY
, но не обязательно отображение для любого другого атрибута вершины.
Nvidia идет на шаг впереди, как указано в примечаниях к выпуску для поддержки языка шейдинга NVIDIA OpenGL; 9 ноября 2006 г .; - стр. 7-8.
Существует фактическое соответствие между атрибутами фиксированной функции и индексами атрибутов вершин, как указано в таблице выше.
См. также ответ на Каковы местоположения атрибутов для фиксированной функции конвейер в профиле ядра OpenGL 4.0 ++?
Я провел несколько тестов и пришел к выводу, что следующая кодировка работает на Nvidia GeForce 940MX, но не работает на интегрированной Intel (R) HD Graphics 620.
Треугольник, указанный следующим образом
static const float varray[]
{
// x y red green blue alpha
-0.707f, -0.75f, 1.0f, 0.0f, 0.0f, 1.0f,
0.707f, -0.75f, 1.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.75f, 0.0f, 0.0f, 1.0f, 1.0f
};
можно рисовать без шейдера, с помощью _5 _ / _ 6_ последовательности,
glBegin( GL_TRIANGLES );
for ( int j=0; j < 3; ++j )
{
glVertex2fv( varray + j*6 );
glColor4fv( varray + j*6 + 2 );
}
glEnd();
указав атрибуты фиксированной функции,
glVertexPointer( 2, GL_FLOAT, 6*sizeof(*varray), varray );
glColorPointer( 4, GL_FLOAT, 6*sizeof(*varray), varray+2 );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glDrawArrays( GL_TRIANGLES, 0, 3 );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
и указав массив общих атрибутов вершин с индексами 0 и 3, которые соответствуют атрибутам фиксированной функции GL_VERTEX_ARRAY
и GL_COLOR_ARRAY
для оборудования Nvidia:
glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 6*sizeof(*varray), varray );
glVertexAttribPointer( 3, 4, GL_FLOAT, GL_FALSE, 6*sizeof(*varray), varray+2 );
glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 3 );
glDrawArrays( GL_TRIANGLES, 0, 3 );
glDisableVertexAttribArray( 0 );
glDisableVertexAttribArray( 3 );
Тот же код будет запущен с использованием следующей программы шейдера OpenGL 2.0,
Вершинный шейдер
#version 110
varying vec4 vertCol;
void main()
{
vertCol = gl_Color;
gl_Position = gl_Vertex;
}
или следующую программу шейдера OpenGL 4.0:
Вершинный шейдер
#version 400
layout (location = 0) in vec3 inPos;
layout (location = 3) in vec4 inColor;
out vec4 vertCol;
void main()
{
vertCol = inColor;
gl_Position = vec4(inPos, 1.0);
}
Ведьма Фрагментного шейдера работает в обоих вышеупомянутых случаях (для полноты картины):
#version 400
in vec4 vertCol;
out vec4 fragColor;
void main()
{
fragColor = vertCol;
}
person
Rabbid76
schedule
21.08.2018
gl_Vertex
,gl_Color
и т. Д. У них нет местоположений атрибутов. Хотя вам больше не следует их использовать. Если вы уже используете шейдеры, то почему бы не создать свои собственные атрибуты и униформу, КАК ВАШЕ ПРЕДЛОЖЕНИЕ. - person vallentin   schedule 13.12.2013