Текстурирование четырехугольника в OpenGL - PullRequest
2 голосов
/ 22 февраля 2020

До сих пор я узнал, как создать куб с текстурами в OpenGL. Теперь я хочу изменить этот код для текстурирования Quad. Я изменил вершины + индексы с куба на квад.

И квад выглядит так:

текстура полностью искажена, а верхний треугольник отсутствует ...

Вот код, который я использую:

1.

GLfloat vertices[] = {
    1.0f,  1.0f, 0.0f,   1.0f, 1.0f, 
    1.0f, -1.0f, 0.0f,   1.0f, 0.0f,  
    -1.0f, -1.0f, 0.0f,   0.0f, 0.0f,  
    -1.0f,  1.0f, 0.0f,   0.0f, 1.0f
};

unsigned int indices[]{
    0,1,2,
    1,2,3,
};

2.

for (size_t o = 0; o < 6; o++) {
    glPixelStorei(GL_UNPACK_ROW_LENGTH, breite_komplett);
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, ausschnitt_x_counter);
    glPixelStorei(GL_UNPACK_SKIP_ROWS, ausschnitt_y_counter);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(
        GL_TEXTURE_CUBE_MAP_POSITIVE_X + o, 0, GL_RGBA, ausschnitt_breite, ausschnitt_höhe, 0, GL_RGBA, GL_UNSIGNED_BYTE, sprite_image.getPixelsPtr());
}
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glEnable(GL_TEXTURE_2D);

У вас есть идеи, что мне нужно изменить?


Редактировать:

unsigned int indices[]{
    0,1,2,
    0,2,3
};

Это мой строитель объектов:

glGenVertexArrays(1, &obj_vao);
glBindVertexArray(obj_vao);

glGenBuffers(1, &obj_ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, obj_ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indicies[0])* indicies_count, indicies, GL_STATIC_DRAW);

glGenBuffers(1, &obj_vbo);
glBindBuffer(GL_ARRAY_BUFFER, obj_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * count_vertices, vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertices[0]) * 5, 0);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertices[0]) * 5, (void*)(sizeof(vertices[0]) * 3));
glEnableVertexAttribArray(1);

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Редактировать:

Если бы вершины были такими:

GLfloat vertices[] = {
    1.0f,  1.0f, -1.0f,   1.0f, 1.0f,
    1.0f, -1.0f, -1.0f,   1.0f, 0.0f,
    -1.0f, -1.0f, -1.0f,   0.0f, 0.0f,
    -1.0f,  1.0f, -1.0f,   0.0f, 1.0f
};

Все было бы хорошо и Квадрат выглядит так: enter image description here

Но мне нужен Квад в исходной точке, например:

GLfloat vertices[] = {
    1.0f,  1.0f, 0.0f,   1.0f, 1.0f,
    1.0f, -1.0f, 0.0f,   1.0f, 0.0f,
    -1.0f, -1.0f, 0.0f,   0.0f, 0.0f,
    -1.0f,  1.0f, 0.0f,   0.0f, 1.0f
};

С этими вершинами текстура искажается .. .

1 Ответ

3 голосов
/ 22 февраля 2020

Индексы двух треугольных примитивов не образуют квадратов. Индексы должны быть:

unsigned int indices[]{ 0, 1, 2, 1, 2, 3 };

unsigned int indices[]{ 0, 1, 2,   0, 2, 3 };
3          0
 +-----+  +
 |   /  / |
 | /  /   |
 +  +-----+
2          1

Когда вы создаете текстуру, вы смешиваете GL_TEXTURE_CUBE_MAP и GL_TEXTURE_2D. Это бессмысленно. Либо создайте текстуру кубической карты и задайте параметры для GL_TEXTURE_CUBE_MAP, либо создайте двухмерную текстуру.


В любом случае, если вы хотите создать текстуру кубической карты, вы должны использовать GL_TEXTURE_CUBE_MAP, когда вы также задаете параметры.

Координата текстуры для куба текстуры трехмерный вектор. Измените координаты вершины для стороны куба. Например:
(Вам не нужны координаты текстуры вообще)

GLfloat vertices[] = {
//   x      y      z     
     1.0f,  1.0f,  1.0f,   1.0f, 1.0f, 
     1.0f, -1.0f,  1.0f,   1.0f, 0.0f,  
    -1.0f, -1.0f,  1.0f,   0.0f, 0.0f,  
    -1.0f,  1.0f,  1.0f,   0.0f, 1.0f
};

Центр куба (0, 0, 0), поэтому вы можете использовать координаты вершины для текстуры тоже:

Вершинный шейдер

in vec3 position;

out vec3 cubeCoord;

void main()
{
    cubeCoord = position;

    // [...]
}

Фрагментный шейдер:

in vec3 cubeCoord;
uniform samplerCube cubeTex;

void main()
{
    vec4 color = texture(cubeTex, cubeCoord);

    // [...]
}

В качестве альтернативы вы можете использовать отдельные трехмерные координаты текстуры для текстуры кубической карты:

GLfloat vertices[] = {
//   x      y      z       u      v      w
     1.0f,  1.0f,  0.0f,   1.0f,  1.0f,  1.0f,
     1.0f, -1.0f,  0.0f,   1.0f, -1.0f,  1.0f,
    -1.0f, -1.0f,  0.0f,  -1.0f, -1.0f,  1.0f,
    -1.0f,  1.0f,  0.0f,  -1.0f,  1.0f,  1.0f,
};
...