c++ - 在 OpenGL 中对四边形进行纹理化

标签 c++ opengl visual-studio-2017 sfml

到目前为止,我已经学会了如何在 OpenGL 中创建带有纹理的立方体。 现在我想更改此代码以对四边形进行纹理化。我已将顶点 + 索引从立方体更改为四边形。

四边形看起来像这样:

纹理完全扭曲,上三角缺失...

这是我正在使用的代码:

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
};

一切都会好起来的,Quad 看起来像这样: enter image description here

但是我需要像这样在原点中使用 Quad:

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
};

有了这个顶点,纹理就会扭曲......

最佳答案

两个三角形基元的索引不形成四边形。索引必须是:

无符号整型索引[]{ 0, 1, 2, 1, 2, 3 };

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

当您创建纹理时,您可以混合 GL_TEXTURE_CUBE_MAPGL_TEXTURE_2D。这是没有意义的。创建立方体贴图纹理并设置 GL_TEXTURE_CUBE_MAP 参数或创建二维纹理。


无论如何,如果你想创建立方体贴图纹理,那么你在设置参数时也必须使用GL_TEXTURE_CUBE_MAP

纹理立方体的纹理坐标是一个 3 维 vector 。更改立方体侧面的顶点坐标。例如:
(您根本不需要纹理坐标)

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);

    // [...]
}

或者,您可以为立方体贴图纹理使用单独的 3 维纹理坐标:

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,
};

关于c++ - 在 OpenGL 中对四边形进行纹理化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352949/

相关文章:

c++ - 为什么我的类(class)在我没有编码的情况下进行算术运算?

c++ - 一个对象可以被认为是一个变量吗?

c++ - 如何使用宏替换赋值操作以用于锁定函数

c++ - 创建了 Blender Obj 但在 OpenGL 中它失去了它的纹理?

java - GLSL 移动点光源

visual-studio-2017 - 创建虚拟目录失败,错误 : cannot write configuration file applicationhost. 配置

visual-studio-2017 - 如何在 Visual Studio 2017 中重新停靠解决方案资源管理器和属性窗口

c++ - 从类返回数组

opengl - glVertexPointer 的用途是什么?

c++ - VS2017下CMake项目使用Conan进行依赖管理