Opengl 使用单个GL_三角形_条的立方体

Opengl 使用单个GL_三角形_条的立方体,opengl,gl-triangle-strip,Opengl,Gl Triangle Strip,是否可以仅使用一个GL\u三角形\u条画出一个完整的立方体 显然,这只是我在这里关心的立方体组合数学,它也可以被拉伸到任何一种盒子或类似的物体中。是的,经过一点实验,我自己找到了答案。想象一下你的立方体的角是黑白相间的。沿两个黑色角之间的每个面绘制三角形边。这样,对角线在立方体内部形成一个四面体。对于[0,1]³立方体,可能的坐标序列如下: Vertex Triangle Face ------+-----------+----- 0 0 0 0 1 0 1 0 0 000 010 1

是否可以仅使用一个
GL\u三角形\u条画出一个完整的立方体


显然,这只是我在这里关心的立方体组合数学,它也可以被拉伸到任何一种盒子或类似的物体中。

是的,经过一点实验,我自己找到了答案。想象一下你的立方体的角是黑白相间的。沿两个黑色角之间的每个面绘制三角形边。这样,对角线在立方体内部形成一个四面体。对于[0,1]³立方体,可能的坐标序列如下:

Vertex  Triangle    Face
------+-----------+-----
0 0 0
0 1 0
1 0 0  000 010 100  **0
1 1 0  100 010 110  **0
1 1 1  100 110 111  1**
0 1 0  111 110 010  *1*
0 1 1  111 010 011  *1*
0 0 1  011 010 001  0**
1 1 1  011 001 111  **1
1 0 1  111 001 101  **1
1 0 0  111 101 100  1**
0 0 1  100 101 001  *0*
0 0 0  100 001 000  *0*
0 1 0  000 001 010  0**
埃文斯、斯基纳和瓦尔什尼的论文:


对于你们这些懒惰的人(像我一样),这里有一个rob mayoff答案的复制粘贴版本;)


可能对某些人有用,这里有一个几何体着色器,它将接收点并输出单位立方体的三角形条带

#version 410

layout(points) in;
layout(triangle_strip, max_vertices = 12) out;

uniform mat4 mvp;

void main() {
    vec4 center = gl_in[0].gl_Position;

    vec4 dx = mvp[0];
    vec4 dy = mvp[1];
    vec4 dz = mvp[2];

    vec4 p1 = center;
    vec4 p2 = center + dx;
    vec4 p3 = center + dy;
    vec4 p4 = p2 + dy;
    vec4 p5 = p1 + dz;
    vec4 p6 = p2 + dz;
    vec4 p7 = p3 + dz;
    vec4 p8 = p4 + dz;

    gl_Position = p7;
    EmitVertex();

    gl_Position = p8;
    EmitVertex();

    gl_Position = p5;
    EmitVertex();

    gl_Position = p6;
    EmitVertex();

    gl_Position = p2;
    EmitVertex();

    gl_Position = p8;
    EmitVertex();

    gl_Position = p4;
    EmitVertex();

    gl_Position = p7;
    EmitVertex();

    gl_Position = p3;
    EmitVertex();

    gl_Position = p5;
    EmitVertex();

    gl_Position = p1;
    EmitVertex();

    gl_Position = p2;
    EmitVertex();

    gl_Position = p3;
    EmitVertex();

    gl_Position = p4;
    EmitVertex();

}

这个版本也有纹理坐标和法线,以备需要

我用WebGL对此进行了测试,立方体的纹理映射正确,但有一些特殊之处,因为每个角确实需要三个纹理坐标,每个面一个。因此,可以使用这些UV对立方体的4个边进行纹理贴图,但顶部和底部将没有适当的纹理

const多维数据集=函数(){
常数u0=0;
常数u1=1;
常数v0=0;
常数v1=1/3;
常数v2=2/3;
常数v3=1;
常数=[
+1, +1, -1,
-1, +1, -1,
+1, -1, -1,
-1, -1, -1,
+1, +1, +1,
-1, +1, +1,
-1, -1, +1,
+1, -1, +1,
];
常数uvs=[
u0,v3,
u0,v0,
u0,v2,
u0,v1,
u1,v3,
u1,v0,
u1,v1,
u1,v2,
];
常量索引=[3,2,6,7,4,2,0,3,1,6,5,4,1,0];
常数v=[];
常数u=[];
对于(var i=0;i
换句话说,要绘制多个断开连接的条带,请检查primitive restart:您测试过吗?它不能产生正确的几何图形,我已经测试过并大量使用过。你的问题在别处。请注意,只有从立方体内部观看时,此三角形条带才朝前。如果要从外部查看多维数据集,请翻转其中一个轴的符号。如果在末尾缺少“EndPrimitive()”调用,则在
main
函数的末尾总是有一个隐式的
EndPrimitive()
。如果要渲染多个基本体,只需显式调用
EndPrimitive()
max_顶点=12
应该是
max_顶点=14
#version 410

layout(points) in;
layout(triangle_strip, max_vertices = 12) out;

uniform mat4 mvp;

void main() {
    vec4 center = gl_in[0].gl_Position;

    vec4 dx = mvp[0];
    vec4 dy = mvp[1];
    vec4 dz = mvp[2];

    vec4 p1 = center;
    vec4 p2 = center + dx;
    vec4 p3 = center + dy;
    vec4 p4 = p2 + dy;
    vec4 p5 = p1 + dz;
    vec4 p6 = p2 + dz;
    vec4 p7 = p3 + dz;
    vec4 p8 = p4 + dz;

    gl_Position = p7;
    EmitVertex();

    gl_Position = p8;
    EmitVertex();

    gl_Position = p5;
    EmitVertex();

    gl_Position = p6;
    EmitVertex();

    gl_Position = p2;
    EmitVertex();

    gl_Position = p8;
    EmitVertex();

    gl_Position = p4;
    EmitVertex();

    gl_Position = p7;
    EmitVertex();

    gl_Position = p3;
    EmitVertex();

    gl_Position = p5;
    EmitVertex();

    gl_Position = p1;
    EmitVertex();

    gl_Position = p2;
    EmitVertex();

    gl_Position = p3;
    EmitVertex();

    gl_Position = p4;
    EmitVertex();

}