Войти
ПрограммированиеФорумГрафика

Текстуры в OpenGL C++ (2 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#15
8:37, 14 фев. 2020
[img=learnopengl_com_blocked | Текстуры в OpenGL C++]

Вот как-то так. А за что я не знаю, может позже найду информацию.

#16
(Правка: 9:14) 8:49, 14 фев. 2020

Кароч, ты делаешь какую-то дичь. Во-первых, весь код с матрицами не имеет смысла. Во-вторых, ты передаёшь текстурные координаты через glTexCoord2f, а в шейдере пишешь layout (location = 2) in vec2 texCoord. Методом тыка и копипаста из разных источников конечно ничего работать не будет.
Вот почитай https://gamedev.ru/code/forum/?id=138435

И ещё, в создании окна надо писать так

windowAttribs.event_mask = ExposureMask | KeyPressMask;
А то нажатие кнопок не обрабатывается.

#17
(Правка: 9:29) 9:11, 14 фев. 2020

Mifls_X
Если ты используешь матрицу Ortho(-4.0,4.0,-4.0,4.0,-10.0,10.0);, то уже  о LookAt(10., 10., 10., 0., 0., 0., 0., 1., 0.); речи быть не может, её нужно использовать при перспективной проекции.
А вообще вот тебе готовый минимальный пример:

+ Показать

shader.vert
+ Показать

shader.frag
+ Показать
#18
11:40, 14 фев. 2020

TheLightWay
Очень странно, но одна страница роскомпозора (https://eais.rkn.gov.ru/) пишет что ничего нету, другая (https://blocklist.rkn.gov.ru/) - что есть.
Блокировка по IP за "призывы к массовым беспорядкам, экстремизм", 16 апреля 2018 года, IP принадлежит DigitalOcean - очень похоже на эхо войны роскомпозора с проксями Телеграма.

#19
20:45, 14 фев. 2020

Dimich
> Кароч, ты делаешь какую-то дичь. Во-первых, весь код с матрицами не имеет
> смысла. Во-вторых, ты передаёшь текстурные координаты через glTexCoord2f, а в
> шейдере пишешь layout (location = 2) in vec2 texCoord.

Ошибку понял, попытался исправить (перезалил), получаю фон заднего буфера.
Думаю на  glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))). До сих пор не до конца понимаю смысл всех аргументов.

#20
21:00, 14 фев. 2020

Mifls_X
> До сих пор не до конца понимаю смысл всех аргументов.

Суслик - посоветуй новые апи

#21
(Правка: 15 фев. 2020, 8:43) 21:16, 14 фев. 2020

Mifls_X
> Думаю на  glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat),
> (GLvoid*)(6 * sizeof(GLfloat))). До сих пор не до конца понимаю смысл всех
> аргументов.

void glVertexAttribPointer(
   GLuint index, // индекс - это номер атрибута начиная с нуля. (например, attrPos = 0, attrNor = 1, ...) порядок должен соответствовать glBindAttribLocation при создании шейдера
   GLint size, // размер, если передаешь vec3 pos, то равно 3
   GLenum type, // тип, если передаешь vec3 pos, то равно GL_FLOAT
   GLboolean normalized, // нормализован? Приведена ли длина вектора к 1?
   GLsizei stride, // это что-то типа ширины потока, обычно равно размеру всех атрибутов вершины (например vec3 pos + vec3 nor + vec2 tc = 32 байта)
   const void * pointer // смещение атрибута в байтах (например, смещение vec3 pos = (void*)0 байт, а смещение следующего за ним vec3 nor = (void*)12 байт)
);

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVerte… Pointer.xhtml

#22
(Правка: 22:02) 21:58, 14 фев. 2020

Mifls_X
Ты передаёшь текстурные координаты, а вершины не передаешь... там же ничего сложного нету...
В коде позиция вершин:
glVertexAttribPointer(0, 3, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
В шейдере:

layout (location = 0) in vec3 position;

В коде цвета:
glVertexAttribPointer(1, 3, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
В шейдере:

layout (location = 1) in vec3 color;

В коде текстурные координаты:
glVertexAttribPointer(2, 2, GL_FLOAT,GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);
В шейдере:

layout (location = 2) in vec2 texCoord;

#23
(Правка: 4:09) 4:05, 15 фев. 2020

programina
> GLsizei stride, // это что-то типа ширины потока, обычно равно размеру всех
> атрибутов вершины
Сама ты ширина потока, stride - это шаг массива, расстояние в байтах между началами соседних элементов.

В целом, stride и pointer задают, с каких адресов считывать значения.
Для вершины номер i значение атрибута считывается, начиная с адреса pointer + i * stride, при этом считываются первые size элементов, остальные устанавливаются по дефолту в {0, 0, 0, 1}.
Возьмём такой пример:

float vb[] = {
    100, 101, 102, 103, 104, 105, 106, 107,
    108, 109, 110, 111, 112, 113, 114, 115 };
Тогда различные сочетания дадут вот такие атрибуты в шейдере:
glVertexAttribPointer(7, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(0 * sizeof(float)));
// vertex 0 atrrib 7 = {100, 101, 102, 103}
// vertex 1 atrrib 7 = {104, 105, 106, 107}
// vertex 2 atrrib 7 = {108, 109, 110, 111}
// vertex 3 atrrib 7 = {112, 113, 114, 115}

glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(0 * sizeof(float)));
// vertex 0 attrib 7 = {100, 101, 0, 1}
// vertex 1 attrib 7 = {104, 105, 0, 1}
// vertex 2 attrib 7 = {108, 109, 0, 1}
// vertex 3 attrib 7 = {111, 112, 0, 1}

glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(0 * sizeof(float)));
// vertex 0 attrib 7 = {100, 101, 0, 1}
// vertex 1 attrib 7 = {105, 106, 0, 1}
// vertex 2 attrib 7 = {110, 111, 0, 1}
// vertex 3 attrib 7 undefined

glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
// vertex 0 attrib 7 = {103, 104, 0, 1}
// vertex 1 attrib 7 = {108, 109, 0, 1}
// vertex 2 attrib 7 = {113, 114, 0, 1}
// vertex 3 attrib 7 undefined
Атрибуты - это всегда 4-векторы. Если какие-то компоненты не задаются через glVertexAtrribPointer, они берутся по дефолту. Если в шейдере атрибут объявлен как vec3, vec2 или float - лишние компоненты пропускаются.

Если к атрибуту прицеплен Vertex Buffer Object - то pointer задаёт стартовое смещение внутри буфера. В противном случае, pointer должен непосредственно указывать на стартовый элемент в памяти.
То есть, можно делать так:

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
Либо, что даст такой же эффект;
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glVertexAttribPointer(7, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), vertices + 6 * sizeof(GLfloat));

normalized применяется вместе целочисленными типами и указывает, что прочитанное из буфера число нужно поделить на максимально возможное для данного типа:

uint8_t bbuf = { 5, 10, 20 };
glVertexAttribPointer(5, 1, GL_BYTE, GL_FALSE, sizeof(uint8_t), bbuf);
// vertex 0 attrib 5 = { 5.0, 0.0, 0.0, 1.0 }
// vertex 1 attrib 5 = { 10.0, 0.0, 0.0, 1.0 }
// vertex 2 attrib 5 = { 15.0, 0.0, 0.0, 1.0 }
glVertexAttribPointer(5, 1, GL_BYTE, GL_TRUE, sizeof(uint8_t), bbuf);
// vertex 0 attrib 5 = { 5.0 / 255.0, 0.0, 0.0, 1.0 }
// vertex 1 attrib 5 = { 10.0 / 255.0, 0.0, 0.0, 1.0 }
// vertex 2 attrib 5 = { 15.0 / 255.0, 0.0, 0.0, 1.0 }

int16_t ibuf = { 500, 2000, -7000 };
glVertexAttribPointer(5, 1, GL_SHORT, GL_FALSE, sizeof(uint16_t), ibuf);
// vertex 0 attrib 5 = { 500.0, 0.0, 0.0, 1.0 }
// vertex 1 attrib 5 = { 2000.0, 0.0, 0.0, 1.0 }
// vertex 2 attrib 5 = { -7000.0, 0.0, 0.0, 1.0 }
glVertexAttribPointer(5, 1, GL_SHORT, GL_TRUE, sizeof(uint16_t), ibuf);
// vertex 0 attrib 5 = { 500.0 / 32767.0, 0.0, 0.0, 1.0 }
// vertex 1 attrib 5 = { 2000.0 / 32767.0, 0.0, 0.0, 1.0 }
// vertex 2 attrib 5 = { -7000.0 / 32767.0, 0.0, 0.0, 1.0 }

#24
(Правка: 5:45) 4:15, 15 фев. 2020

А вообще, как более-менее освоишься с основами, рекомендую сесть за OpenGL ES 2.0 Specification (в комплекте с ES Shading Language) и изучить его целиком. ES 2 достаточно примитивен, чтобы целиком уместиться в голове человека, и при этом даёт более-менее актуальное представление о принципах, на которых работают современные графические ускорители - о конвеере, растеризации, шейдерах и прочем в том же духе.

#25
(Правка: 8:42) 8:03, 15 фев. 2020

Delfigamer
> это шаг массива
какого такого массива? ))

+ Тут я вижу 2 потока, массивов не вижу совсем
#26
(Правка: 12:26) 12:22, 15 фев. 2020

programina
> массивов не вижу совсем

struct PositionNormal
{
    Vector3 position;
    Vector3 normal;
};

struct Object
{
    PositionNormal* positionNormal; // это что, розовый единорог?
    Vector2* texcoord; // а это что, предвыборная кампания Жириновского?
};

И да, притворюсь крутым и скажу, в твоём слайде - говнокод. В нормальной программе stride и pointer  выражаются через sizeof и offsetof.

#27
(Правка: 14:14) 14:13, 15 фев. 2020

Delfigamer
> PositionNormal* positionNormal;
> Vector2* texcoord;
и как по-твоему glVertexAttribPointer взаимодействует с твоими массивами? )

#28
14:32, 15 фев. 2020

programina
> и как по-твоему glVertexAttribPointer взаимодействует с твоими массивами? )
Это VBO все массивы в памяти GPU.

#29
15:50, 15 фев. 2020

Delfigamer
> В нормальной программе stride и pointer  выражаются через sizeof и offsetof.
по всем правилам да

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумГрафика