glTexCoord3D
不使用NDC !!! 它是一个方向向量。
过去我也曾经苦恼于同样的问题... GL_TEXTURE_CUBE_MAP
难以入手...
为了让事情变得更加简单,这里是我在旧API中的渲染代码(从我的引擎中提取):
void OpenGL_TXR::cube_draw_CW(double size,int unit)
{
int i,j;
double a=size;
double pnt[8][3]=
{
+a,-a,+a,
+a,+a,+a,
-a,+a,+a,
-a,-a,+a,
+a,-a,-a,
+a,+a,-a,
-a,+a,-a,
-a,-a,-a
};
int tab[24]=
{
0,1,2,3,
7,6,5,4,
4,5,1,0,
5,6,2,1,
6,7,3,2,
7,4,0,3
};
glColor3f(1,1,1);
glBegin(GL_QUADS);
for (i=23;i>=0;i--)
{
j=tab[i];
glMultiTexCoord3dv(GL_TEXTURE0+unit,pnt[j]);
glVertex3dv(pnt[j]);
}
glEnd();
}
size
是立方体的一半尺寸,unit
是贴图单元,用于绑定你的立方体贴图。
但它会渲染一个带纹理的立方体。如果您想要呈现布局,则只需使用不同的顶点,但使用相同的纹理坐标。类似这样:
void cube_draw2D_CW(double size,int unit)
{
int i,j;
const double a=size,a0=-3.0*a,a1=a0+a+a,a2=a1+a+a,a3=a2+a+a;
const double b=1.7320508075688772935274463415059;
double pnttxr[8][3]=
{
+b,-b,+b,
+b,+b,+b,
-b,+b,+b,
-b,-b,+b,
+b,-b,-b,
+b,+b,-b,
-b,+b,-b,
-b,-b,-b
};
double pntver[24][3]=
{
a1+a,a0+a-a,+0.0,
a1+a,a0+a+a,+0.0,
a1-a,a0+a+a,+0.0,
a1-a,a0+a-a,+0.0,
a1+a,a2+a-a,+0.0,
a1+a,a2+a+a,+0.0,
a1-a,a2+a+a,+0.0,
a1-a,a2+a-a,+0.0,
a0+a,a1+a-a,+0.0,
a0+a,a1+a+a,+0.0,
a0-a,a1+a+a,+0.0,
a0-a,a1+a-a,+0.0,
a1+a,a1+a-a,+0.0,
a1+a,a1+a+a,+0.0,
a1-a,a1+a+a,+0.0,
a1-a,a1+a-a,+0.0,
a2+a,a1+a-a,+0.0,
a2+a,a1+a+a,+0.0,
a2-a,a1+a+a,+0.0,
a2-a,a1+a-a,+0.0,
a3+a,a1+a-a,+0.0,
a3+a,a1+a+a,+0.0,
a3-a,a1+a+a,+0.0,
a3-a,a1+a-a,+0.0,
};
int tabtxr[24]=
{
4,0,3,7,
1,5,6,2,
3,2,6,7,
0,1,2,3,
4,5,1,0,
7,6,5,4,
};
int tabver[24]=
{
0,1,2,3,
4,5,6,7,
8,9,10,11,
12,13,14,15,
16,17,18,19,
20,21,22,23,
};
glColor3f(1,1,1);
glBegin(GL_QUADS);
for (i=23;i>=0;i--)
{
j=tabtxr[i];
glMultiTexCoord3dv(GL_TEXTURE0+unit,pnttxr[j]);
j=tabver[i];
glVertex3dv(pntver[j]);
}
glEnd();
}
这是预览图:
![preview](https://istack.dev59.com/EbHpT.webp)
1.0
。我只在其中放入sqrt(3.0)
是因为它只是常数,不需要额外的计算,当我几年后查看其中的内容时,它会让我知道这是一个向量而不是位置... - Spektre+/-a
改为-/+a
)以匹配你的矩阵,或者通过在模型视图中缩放y轴来实现-1
。也可能是你的纹理与我的相比被加载反转了... - Spektre(0,0)
是左上角是标准的,但在GL中不是...)不要紧,你仍然可以翻转以匹配你需要的内容,无论是在加载还是渲染时都可以...我认为你甚至可以翻转GL_TEXTURE
矩阵,但不确定这是否适用于立方体贴图... - Spektre