gpt4 book ai didi

c++ - 纹理化一个 opengl 立方体

转载 作者:行者123 更新时间:2023-12-01 14:22:59 26 4
gpt4 key购买 nike

我有一个 opengl 立方体,我想对所有 6 个面进行纹理处理。

我需要多个纹理吗?

这是当前立方体的屏幕截图:

img

基本上我不知道如何将纹理包裹在整个立方体周围......

这是我的 cube.h 头文件,其中定义了 IBO 和 VBO

#pragma once
#include <GL\glew.h>

class cube {
public:
cube() {
x = 0;
y = 0;
z = 0;
width = 0;
vertices = 0;
indices = 0;
}
cube(GLfloat X, GLfloat Y, GLfloat Z, float w) {
x = X;
y = Y;
z = Z;
width = w;

vertices = new GLfloat[40];

//1
vertices[0] = x; //x pos
vertices[1] = y; //y pos
vertices[2] = z; //z pos

vertices[3] = 0; //x pos in texture
vertices[4] = 1; //y pos in texture
//2
vertices[5] = x + width;
vertices[6] = y;
vertices[7] = z;

vertices[8] = 1;
vertices[9] = 1;
//3
vertices[10] = x;
vertices[11] = y - width;
vertices[12] = z;

vertices[13] = 0;
vertices[14] = 0;
//4
vertices[15] = x + width;
vertices[16] = y - width;
vertices[17] = z;

vertices[18] = 1;
vertices[19] = 0;
//5
vertices[20] = x;
vertices[21] = y;
vertices[22] = z - width;

vertices[23] = 0;
vertices[24] = 1;
//6
vertices[25] = x + width;
vertices[26] = y;
vertices[27] = z - width;

vertices[28] = 1;
vertices[29] = 1;
//7
vertices[30] = x;
vertices[31] = y - width;
vertices[32] = z - width;

vertices[33] = 0;
vertices[34] = 0;
//8
vertices[35] = x + width;
vertices[36] = y - width;
vertices[37] = z - width;

vertices[38] = 1;
vertices[39] = 0;

//indices
indices = new unsigned int[36];
//0
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
//1
indices[3] = 1;
indices[4] = 2;
indices[5] = 3;
//2
indices[6] = 4;
indices[7] = 5;
indices[8] = 6;
//3
indices[9] = 5;
indices[10] = 6;
indices[11] = 7;
//4
indices[12] = 4;
indices[13] = 0;
indices[14] = 1;
//5
indices[15] = 4;
indices[16] = 5;
indices[17] = 1;
//6
indices[18] = 6;
indices[19] = 2;
indices[20] = 3;
//7
indices[21] = 6;
indices[22] = 7;
indices[23] = 3;
//8
indices[24] = 1;
indices[25] = 5;
indices[26] = 3;
//9
indices[27] = 5;
indices[28] = 7;
indices[29] = 3;
//10
indices[30] = 4;
indices[31] = 0;
indices[32] = 2;
//11
indices[33] = 4;
indices[34] = 6;
indices[35] = 2;
}

GLfloat* vertices;
unsigned int* indices;
private:
GLfloat x;
GLfloat y;
GLfloat z;
float width;
};

所有这些代码所做的就是为以后使用的多维数据集对象设置一个简单的 VBO 和 IBO/EBO。

最佳答案

问题是每个立方体顶点在 3 个面之间共享,其中其纹理坐标可能不同。因此,您要么复制此类顶点(每个顶点具有不同的纹理坐标),要么使用 2 个单独的索引(一个用于顶点,一个用于纹理)。

重复可能看起来像这样(使用 GL_QUADS 原语):

double cube[]=
{
// x, y, z, s, t,
+1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,-1.0,1.0,1.0,
-1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,-1.0,0.0,0.0,

-1.0,+1.0,-1.0,0.0,0.0,
-1.0,-1.0,-1.0,0.0,1.0,
-1.0,-1.0,+1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,

-1.0,-1.0,+1.0,0.0,1.0,
+1.0,-1.0,+1.0,1.0,1.0,
+1.0,+1.0,+1.0,1.0,0.0,
-1.0,+1.0,+1.0,0.0,0.0,

+1.0,-1.0,-1.0,1.0,1.0,
+1.0,+1.0,-1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,
+1.0,-1.0,+1.0,0.0,1.0,

+1.0,+1.0,-1.0,0.0,1.0,
-1.0,+1.0,-1.0,1.0,1.0,
-1.0,+1.0,+1.0,1.0,0.0,
+1.0,+1.0,+1.0,0.0,0.0,

+1.0,-1.0,+1.0,0.0,0.0,
-1.0,-1.0,+1.0,1.0,0.0,
-1.0,-1.0,-1.0,1.0,1.0,
+1.0,-1.0,-1.0,0.0,1.0,
};

使用这种纹理:

texture

这(对于旧的 GL api 很抱歉,但它更容易测试):
int i,n=sizeof(cube)/(sizeof(cube[0]));
glColor3f(1.0,1.0,1.0);
scr.txrs.bind(txr);
glBegin(GL_QUADS);
for (i=0;i<n;i+=5)
{
glTexCoord2dv(cube+i+3);
glVertex3dv(cube+i+0);
}
glEnd();
scr.txrs.unbind();

我得到了这个结果:

preview

关于c++ - 纹理化一个 opengl 立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61604128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com