在OpenGL中纹理四边形

凯勒

到目前为止,我已经学习了如何在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
};

一切都会好起来,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
};

有了这个顶点,纹理就变形了。

拉比德76

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

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

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

When you crate the texture, the you mix GL_TEXTURE_CUBE_MAP and GL_TEXTURE_2D. That makes no sense. Either create a cubemap texture and set the parameters for the GL_TEXTURE_CUBE_MAP or create a 2 dimensional texture.


Anyway if you want to create a cubemap texture, then you have to use GL_TEXTURE_CUBE_MAP, when you set the parameters, too.

The texture coordinate for a texture cube is a 3 dimensional vector. Change the vertex coordinates for the side of the cube. e.g:
(You don't need the texture coordinates at all)

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

The center of the cube is (0, 0, 0), so you can use the vertex coordinates for the texture, too:

Vertex shader

in vec3 position;

out vec3 cubeCoord;

void main()
{
    cubeCoord = position;

    // [...]
}

Fragment shader:

in vec3 cubeCoord;
uniform samplerCube cubeTex;

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

    // [...]
}

Alternatively you can use separate 3 dimensional texture coordinates for the cubemap texture:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过纹理四边形的OpenGL字体

来自分类Dev

像素条纹中的纹理四边形渲染

来自分类Dev

如何在openGL中纹理随机凸四边形

来自分类Dev

从.obj文件在OpenGL中绘制四边形

来自分类Dev

在OpenGL中围绕坐标旋转四边形

来自分类Dev

OpenGL不会同时绘制带纹理和无纹理的四边形

来自分类Dev

如何在OpenGL中正确纹理四边形

来自分类Dev

OpenGL-裁剪并奇怪拉伸的纹理四边形

来自分类Dev

OpenGL将纹理四边形渲染为(0,0)的单个像素?

来自分类Dev

LWJGL纹理未拉伸到四边形

来自分类Dev

C#OpenTK-纹理四边形

来自分类Dev

我无法在四边形上显示纹理

来自分类Dev

C#OpenTK-纹理四边形

来自分类Dev

如何在Metal中的四边形中正确渲染纹理?

来自分类Dev

如何用另一个四边形遮罩OpenGL四边形

来自分类Dev

在OpenGL中旋转四边形无法正确显示(rotatef)

来自分类Dev

OpenCV在Python中检测四边形

来自分类Dev

查找网格中的所有四边形

来自分类Dev

在opencv中绘制四边形

来自分类Dev

OpenCV在Python中检测四边形

来自分类Dev

CSS中的四边形梯形

来自分类Dev

如何在2个四边形的相交部分使用不同的纹理

来自分类Dev

如何在2个四边形的相交部分使用不同的纹理

来自分类Dev

将纹理坐标包装在可变大小的四边形上?

来自分类Dev

绘制纹理四边形看起来扭曲

来自分类Dev

使用AffineTransform从四边形转换为四边形?

来自分类Dev

在openGl 3.1或更高版本上,我应该使用什么绘制四边形?

来自分类Dev

渲染大量四边形的有效方法(LibGDX / OpenGL ES)

来自分类Dev

渲染大量四边形的有效方法(LibGDX / OpenGL ES)