当前位置: 首页 > 知识库问答 >
问题:

使用几何体着色器优化立方体渲染

谷梁淇
2023-03-14

在我的第一个opengl“体素”项目中,我使用几何着色器从gl_points创建立方体,它工作得很好,但我相信它可以做得更好。在alpha颜色中,我传递关于应该渲染哪些面的信息(跳过与其他立方体相邻的面),然后使用“引用”立方体定义创建可见面的顶点。每个点乘以3个矩阵。直觉告诉我,也许整张脸可以乘以它们,而不是每一点,但是我的数学技能很差,所以请建议。

#version 330 
layout (points) in;
layout (triangle_strip,max_vertices=24) out;

smooth out vec4 oColor;
in VertexData 
{
    vec4 colour;
    //vec3 normal;
} vertexData[];

uniform mat4 cameraToClipMatrix;
uniform mat4 worldToCameraMatrix;
uniform mat4 modelToWorldMatrix;

const vec4 cubeVerts[8] = vec4[8](
    vec4(-0.5 , -0.5, -0.5,1),  //LB   0
     vec4(-0.5, 0.5, -0.5,1), //L T   1
    vec4(0.5, -0.5, -0.5,1), //R B    2
    vec4( 0.5, 0.5, -0.5,1),  //R T   3
                        //back face
    vec4(-0.5, -0.5, 0.5,1), // LB  4
     vec4(-0.5, 0.5, 0.5,1), // LT  5
    vec4(0.5, -0.5, 0.5,1),  // RB  6
     vec4(0.5, 0.5, 0.5,1)  // RT  7
    );

const int  cubeIndices[24]  = int [24]
    (
      0,1,2,3, //front
      7,6,3,2, //right
      7,5,6,4,  //back or whatever
      4,0,6,2, //btm 
      1,0,5,4, //left
      3,1,7,5
    );      

void main()
{       
    vec4 temp;  
    int a = int(vertexData[0].colour[3]);
    //btm face
    if (a>31)
    {
        for (int i=12;i<16; i++)
        {
            int v = cubeIndices[i];
            temp = modelToWorldMatrix * (gl_in[0].gl_Position + cubeVerts[v]);
            temp = worldToCameraMatrix * temp;
            gl_Position = cameraToClipMatrix * temp;
            //oColor = vertexData[0].colour;
            //oColor[3]=1;
            oColor=vec4(1,1,1,1);       
            EmitVertex();
        }   
        a = a - 32;
        EndPrimitive(); 
    }
    //top face
    if (a >15 )
...
}

------- 更新的代码:------

//one matrix to transform them all
mat4 mvp = cameraToClipMatrix * worldToCameraMatrix * modelToWorldMatrix;
//transform and store cube verts for future use 
for (int i=0;i<8; i++) 
{
    transVerts[i]=mvp * (gl_in[0].gl_Position + cubeVerts[i]);
}
//btm face
if (a>31)
{
    for (int i=12;i<16; i++)
    {
        int v = cubeIndices[i];
        gl_Position = transVerts[v];
        oColor = vertexData[0].colour*0.55;
        //oColor = vertexData[0].colour;
        EmitVertex();
    }   
    a = a - 32;
    EndPrimitive(); 
}

共有1个答案

万乐逸
2023-03-14

在OpenGL中,您不处理面孔(或线条),因此您不能将转换应用于面孔。你需要对组成这张脸的顶点做这件事,就像你正在做的那样。

关于可能的优化,您不需要像您那样分离矩阵变换。如果在应用程序代码中多次使用它们,并将它们作为单个统一体传递到着色器中,则会节省一些时间。

另一个优化是在开始时变换循环中的八个立方体顶点,将它们存储到本地数组,然后在if逻辑中引用它们变换后的位置。现在,如果渲染立方体的每个面,将变换24个顶点,每个顶点三次。

 类似资料:
  • 我用C SDL2 GLEW Opengl 4.1编程一个小的体素游戏,有点像Minecraft。 我正在尽可能优化体素渲染。 我把世界滑成一块块,而这块块又滑成一块块。 每个块包含16x16x16个块。 现在,如果编辑块(删除/放置块),我将重建完整块和相邻块,并将其与vao和vbo一起上载到图形卡。 现在,为了最小化顶点数据,我必须从cpu传输到gpu,我使用几何体着色器。 首先,这是个好主意吗

  • 使用GLE管材和挤出库(http://www.linas.org/gle/)我能够使用OpenGL将2D计数挤出到3D对象中。该库在CPU上完成所有工作,并使用OpenGL即时模式。 我想在GPU上使用几何着色器进行挤压可能会更快,尤其是在渲染大量几何图形时。因为我还没有在OpenGL中使用几何着色器的任何经验,我想知道这是否可能,以及我必须注意什么。您认为将这些计算转移到GPU并提高性能是个好主

  • 我正在尝试制作一个几何体着色器(使用着色器生成器)来简化模型。首先,我试图做一个体素化,但结果不好,我找不到它的错。 在下面的代码中,想法是找到输入三角形的中心,然后使其成为我要创建的框的中心。 我知道这不是世界上最优雅的代码,但先走一步,我需要让它工作...

  • 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。 废话不多说,我们直接先看一个几何着色器的例子: #version 330 core layout

  • BoxGeometry是四边形的原始几何类,它通常使用构造函数所提供的“width”、“height”、“depth”参数来创建立方体或者不规则四边形。// iOS iframe auto-resize workaround if ( /(iPad|iPhone|iPod)/g.test( navigator.userAgent ) ) { const scene = document.getEl

  • 本节课对WebGL光照的介绍主要目的是让你对WebGL光照,以及如何在代码层面实现WebGL光照算法有个大致的轮廓认知,计算机图形学中关于光照相关算法的介绍更为详细和系统,如果有兴趣可以阅读计算机图形学的书籍。 光线照在物体上,物体反射光线就会构成一个光场,眼睛看到生活中的物体有立体感就是因为有光的存在。因此在学习物理光学在WebGL编程中如何应用, 你就要先了解基本的光学知识。 生活中你看到一个